2014-05-21 13 views
14

Nella documentazione testamentaria che danno consigli su come si può avere accesso a current_user quando si verifica un controller:Come accedere (progettare) current_user in un test di funzionalità rspec?

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

Tuttavia, che dire di quando si fa un test di funzionalità? Sto provando a testare un metodo di creazione di uno dei miei controller e in quel controller viene utilizzata la variabile current_user.

Il problema è che la macro suggerita in devise utilizza la variabile @request ed è nil per una specifica di funzionalità. Che cos'è una soluzione alternativa?

EDIT:

Questo è quello che ho finora per la mia attuale spec:

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 

Il problema è che nel mio OrdersController ho una chiamata current_user.orders, e dal momento che current_user non è definito, si mi reindirizzerà a /users/sign_in.

ho definito questo sotto /spec/features/manage_orders.rb

+0

ho usato per qualcosa di simile –

+1

Inoltre, vedere http://blog.pixarea.com/2013/01/ making-rspec-feature-specs-easy-with-devise e http://stackoverflow.com/questions/5865555/how-to-do-integration-testing-with-rspec-and-devise-cancan. –

+0

Forse include il codice di prova che stai tentando di scrivere? Puoi semplicemente fingere che 'current_user' sia lì, penso che sarà di grande aiuto nel chiarire le tue intenzioni. –

risposta

0

Ecco quello che penso che sono alla ricerca di:

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

è possibile definire login_user come metodo per l'utente per il login come segue (metterlo nella cartella di supporto):

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 

Poi nello scenario dicono:

user = login_user 
18

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

Se vi ho capito bene, forse è necessario utilizzare

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

ad esempio:

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 

Non dimenticare di includere t la sua sul suo spec_helper.rb: https://github.com/railsware/rack_session_access

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

Semplicemente questo ha funzionato per me: subject.current_user.email – ntonnelier

+0

dove mettere il controller_macros.rb? Nella cartella spec/support? –

+0

@ aldrien.h si. – RMazitov

Problemi correlati