2011-06-19 17 views
18

Zgodnie z this z devise wiki powinienem móc użyć metody helpera login_user w moich testach kontrolera. W związku z tym mam następujące ciągu spec katalogu:rspec i opracuj pomocników testowych

#spec_helper.rb 
... 
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
    config.extend ControllerMacros, :type => :controller 
... 

i

#support/controller_macros.rb 
module ControllerMacros  
    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     @user = Factory.create(:user) 
     sign_in @user 
    end 
    end 
end 

jednak wywołanie pomocnika nie działa:

#requests/some_spec.rb 
require 'spec_helper' 
describe "GET /guides/edit" do 
    login_user  
end 

ktoś może wskazać stronę, gdzie jadę źle. Zestaw testów działa na tej podstawie. Otrzymuję niezdefiniowaną lokalną zmienną lub komunikat o metodzie, więc domyślam się, że moduł nie jest uwzględniany.

Rails 3.0.7 rspec 2.6.0 Devise 1.3.4

backtrace

+0

Czy to jest literówka w Twoim pliku some_spec.rb? 'log_in' /' login_user' – Dogbert

+0

Ups, przepraszam. Naprawiony. – mark

+1

Jaki jest ślad śledzenia wstecznego? –

Odpowiedz

18

Wyobrażam sobie, że z tym podejściem wiąże się kilka problemów. Po pierwsze, używasz specyfikacji zleceń, a nie specyfikacji kontrolera, więc metoda login_user nie jest dostępna przez config.extend ControllerMacros, :type => :controller. Po drugie, nawet jeśli jesteś w stanie uwzględnić tę metodę, najprawdopodobniej to nie zadziała, ponieważ pomoce testowe Devise zostały napisane specjalnie dla testów kontrolerów/widoków, a nie testów integracyjnych.

Zobacz, jak David Chelimsky ma answer do this SO question, co może być pomocne.

+0

Dzięki zetetic. Masz całkowitą rację, myliłem kontroler i zażądałem specyfikacji. Połączona odpowiedź działa idealnie. – mark

+0

Jak sign_out z zalogowanych sesji w specyfikacji. – aashish

4

Nie mogę odpowiedzieć na pewno ... ale zapach kod dla mnie jest „przed (: każdy) "zdefiniowane wewnątrz pomocnika. dlaczego nie spróbować:

#support/controller_macros.rb 
module ControllerMacros  
    def login_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    @user = Factory.create(:user) 
    sign_in @user 
    end 
end 

i

#requests/some_spec.rb 
require 'spec_helper' 
describe "GET /guides/edit" do 
    before(:each) do 
    login_user  
    end 
end 

a jeśli to się nie powiedzie - a może to po prostu nie może znaleźć @request - w takim przypadku przekazać go jako zmienną do login_user

Edytuj:

Wygląda na to, że konieczne może być dołączenie pomocników testowych. rdoc mówi trzeba mieć ten plik

# spec/support/devise.rb 
RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

Nie jestem pewien, czy to różni się od tego, jak już masz go w spec_helper.rb ... wygląda bardzo podobnie do mnie.

+0

Dzięki za odpowiedź. Próbowałem tego, ale to zawsze brakująca zmienna/błąd metody, która sugeruje, że moduł nie jest w ogóle włączony. – mark

+0

Hmm - przepraszam - używam go z Test :: Unit (chociaż używam programu rspec w innym projekcie), więc domyślam się tylko ... Być może potrzebujesz "devise" w spec_helper.rb? –

+0

należą Devise :: TestHelpers –

0

Mam ten sam problem z Rails 3.0.10 rspec 2.6.0 wymyślić 1.3.4 spork-0.9.0.rc9 na mojej specyfikacji kontrolera, zmieniłem config. extend na config.include i jego pracy!

0

Nie zapomnij potwierdzić, że nie można potwierdzić Twojej aplikacji. Twój kod powinien wyglądać tak:

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 
Powiązane problemy