web-dev-qa-db-fra.com

Comment accéder à (current) utilisateur actuel dans un test de fonctionnalité rspec?

Dans la documentation de l'interface, ils donnent des conseils sur la manière dont vous pouvez accéder à current_user lors du test d'un contrôleur:

https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29

Cependant, qu'en est-il lors d'un test de fonctionnalité? J'essaie de tester une méthode de création de l'un de mes contrôleurs et la variable current_user est utilisée dans ce contrôleur.

Le problème est que la macro suggérée dans le système utilise la variable @request, qui est nulle pour une spécification de fonctionnalité. Qu'est-ce qu'une solution de contournement?

MODIFIER:

Voici ce que j'ai jusqu'à présent pour mes spécifications actuelles:

feature 'As a user I manage the orders of the system' do
  scenario 'User is logged in ad an admin' do
    user = create(:user)
    order = create(:order, user: user)
    visit orders_path
    #Expectations
  end
end

Le problème est que, dans ma OrdersController, j'ai un appel current_user.orders et, étant donné que current_user n'est pas défini, il me redirigera vers /users/sign_in.

J'ai défini ceci sous /spec/features/manage_orders.rb

19
Hommer Smith

from https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29

si je vous ai bien compris, vous avez peut-être besoin d'utiliser

subject.current_user.email
#or
controller.current_user.email

par exemple :

describe OrdersController, :type => :controller do
  login_user

  describe "POST 'create'" do
     it "with valid parametres" do
        post 'create', title: 'example order', email: subject.current_user.email
     end
  end
end

controller_macros.rb:

module ControllerMacros
  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryGirl.create(:user)
      #user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the "confirmable" module
      sign_in user
    end
  end
end

N'oubliez pas d'inclure ceci dans votre spec_helper.rb:

config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
26
RMazitov

Voici ce que je pense que vous recherchez:

require 'spec_helper'
include Warden::Test::Helpers
Warden.test_mode!

feature 'As a user I manage the orders of the system' do
  scenario 'User is logged in ad an admin' do
    user = create(:user)
    login_as(user, scope: :user)
    order = create(:order, user: user)
    visit orders_path
    #Expectations
  end
end
2
Alec Rooney

vous pouvez définir login_user comme méthode permettant à l'utilisateur de se connecter comme suit (mettez-le dans le dossier de support): 

def login_user
  Warden.test_mode!
  user = create(:user)
  login_as user, :scope => :user
  user.confirmed_at = Time.now
  user.confirm!
  user.save
  user
end

Ensuite, dans le scénario, dites:

user = login_user
1
Hany Elsioufy