2011-06-19 72 views
18

this從色器件維基我應該能夠在我的控制器的測試使用login_user helper方法。因此我已在規範目錄中的以下內容:rspec的設計與測試助手

#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 
... 

#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 

但是調用助手不起作用:

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

可有人朝我要去的地方點錯誤。測試套件從此起作用。我得到一個未定義的局部變量或方法消息,所以我猜這個模塊沒有被包含。

的Rails 3.0.7 rspec的2.6.0 色器件1.3.4

backtrace

+0

這是你的some_spec.rb中的拼寫錯誤嗎? 'log_in' /'login_user' – Dogbert

+0

哎呀,對不起。固定。 – mark

+1

你得到的回溯是什麼? –

回答

18

我想有一對夫婦使用這種方法的問題。首先是,你使用的要求規範,不規範控制器,所以login_user方法不受config.extend ControllerMacros, :type => :controller提供。其次,即使你能包括方法它最有可能無論如何都不會工作,因爲設計測試傭工的控制器/視圖測試,而不是集成測試編寫的。

看看大衛Chelimsky的answerthis SO question,這可能有所幫助。

+0

謝謝zetetic。你完全正確,我讓控制器和請求規格混淆。鏈接的答案完美。 – mark

+0

如何在規格中登錄登錄會話。 – aashish

4

我不能回答是肯定的,而是爲了我的代碼聞到的是「前(:每個)「在幫助程序中定義。你爲什麼不嘗試:

#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 

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

如果失敗 - 也許它只是找不到@request - 在這種情況下,把它作爲一個變量login_user

編輯:

看起來你可能需要包括設計測試助手。 的rdoc說,你應該有這樣的文件:

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

不知道,從你怎麼已經有了它spec_helper.rb 不同......看起來很相似,我。

+0

感謝您的回答。我試過了,但它總是缺少方法變量/錯誤,似乎表明該模塊根本沒有包含在內。 – mark

+0

嗯 - 對不起 - 我使用它與Test :: Unit(雖然我在另一個項目上使用rspec),所以我只是猜測...也許你可能需要spec_helper.rb'設計'? –

+0

包括Devise :: TestHelpers –

0

我對Rails 3.0.10 rspec 2.6.0 devise 1.3.4 spork-0.9.0.rc9在我的控制器規格上有同樣的問題,我已將config. extend更改爲config.include及其工作!

0

忘記確認,如果您的應用程序不確認的。你的代碼應該看起來像

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