2014-05-21 6 views
14

In der devise Dokumentation geben sie Tipps, wie Sie den Zugriff auf current_user haben kann, wenn ein Controller testen:Wie auf current_user in einem rspec-Feature-Test zugreifen (entwickeln)?

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

aber was ist, wenn ein Feature-Test zu tun? Ich versuche, eine create-Methode eines meiner Controller zu testen, und in diesem Controller wird die current_user-Variable verwendet.

Das Problem besteht darin, dass das in devise vorgeschlagene Makro die @ request-Variable verwendet und für eine Feature-Spezifikation null ist. Was ist eine Problemumgehung?

EDIT:

Das ist, was ich bisher für meine aktuelle Spezifikation haben:

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 

Das Problem ist, dass in meinem OrdersController habe ich einen current_user.orders Anruf, und da current_user ist nicht definiert, es werde mich zu /users/sign_in umleiten.

I definiert haben dies unter /spec/features/manage_orders.rb

+0

Ich mag, dass –

+1

verwendet https://github.com/railsware/rack_session_access für sich auch etwas haben, sehen http://blog.pixarea.com/2013/01/ make-rspec-feature-specs-easy-with-devise und http://stackoverflow.com/questions/5865555/how-to-do-integration-testing-with-rspec-and-devise-cancan. –

+0

Fügen Sie vielleicht den Testcode ein, den Sie schreiben möchten? Sie können einfach so tun, als wäre "current_user" da. Ich denke, das wird Ihnen sehr dabei helfen, Ihre Absichten zu klären. –

Antwort

0

Hier ist, was ich glaube, Sie suchen:

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 
1

Sie login_user als Methode für den Benutzer definieren kann wie folgt anmelden (Put es in Support-Ordner):

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 

dann im Szenario sagen:

user = login_user 
18

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

, wenn ich Sie richtig verstanden habe, vielleicht brauchen Sie

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

zum Beispiel verwenden:

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 

Vergiss nicht, t aufzunehmen seine in Ihrem spec_helper.rb:

config.include Devise::TestHelpers, type: :controller 
config.extend ControllerMacros, type: :controller 
+0

Einfach funktioniert das für mich: subject.current_user.email – ntonnelier

+0

wo die controller_macros.rb? Im Spezifikations-/Supportordner? –

+0

@ aldrien.h ja. – RMazitov

Verwandte Themen