2011-08-21 35 views
6

我有一個spec/controllers/add_to_carts_spec.rb未定義的方法`sign_in' <:: RSpec的核心:: ExampleGroup :: Nested_1 :: Nested_1:0x1057fd428>錯誤,而試圖建立與RSpec的設計

require 'spec_helper' 

describe CartItemsController do 

    before (:each) do 
    @user = Factory(:user) 
    sign_in @user 
    end 

    describe "add stuff to the cart" do 
    it "should add a product to the cart" do 
     product = FactoryGirl.create(:product) 
     visit products_path(product) 
     save_and_open_page 
     click_on('cart_item_submit') 
    end 
    end 

end 

/spec/support/spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'capybara/rspec' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

RSpec.configure do |config| 
    config.mock_with :rspec 
    config.use_transactional_fixtures = true 
end 

...同時也裝入/spec/support/devise.rb

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

衛隊在後臺運行,並不斷拋出這樣的:

Failures: 

    1) CartItemsController add stuff to the cart should add a product to the cart 
    Failure/Error: sign_in @user 
    NoMethodError: 
     undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428> 
    # ./spec/controllers/add_to_carts_spec.rb:7 

我已經花了幾個小時嘗試不同的配置調整和不同的語法,但似乎沒有任何改變。有任何想法嗎?

(編輯,以反映新的錯誤)

回答

12

這些測試傭工不會集成/要求規範工作。在這些情況下測試Devise的建議方法是訪問登錄頁面,填寫表單並提交,然後運行測試。

請參閱David Chelimsky's answer對此主題以前的SO問題有更完整的解釋。

+1

這是一個控制器規格,所以我期望它的工作。 – solnic

+1

謝謝,你是對的。我混淆了兩種規格。我正在使用水豚訪問頁面,因此使用其會話機制,但嘗試登錄用戶,就像我在我的控制器規格中那樣。水豚不使用或訪問這些。 –

14

出於某種原因,這也並沒有爲我工作,所以我只是手動包括這個幫手我的規格是這樣的:

describe CartItemsController do 
    include Devise::TestHelpers 

    # ... 
end 
+0

真的很方便,謝謝 – Starkers

17

理想的解決方案是建立在投機/支持文件/設計通過下面的代碼.RB,包括在Rspec的配置的色器件測試助手:

Rspec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

類型參數僅包含在你的控制器規格的幫手,這是爲了避免可能從它的調用測試時出現的未來的問題模型或視圖。這是可選的。

我們決定添加一個獨立文件來包含助手,而不是像上面那樣將它們包含在規格中,這是因爲如果規格被重新生成,規格將被覆蓋。

+0

這個答案沒有upvotes(除了我自己的),工作得很好。不要忽視這個可能的解決方案。 – Ecnalyr

+0

雖然這是包含這些助手的正確方法,但原始海報已經使用此方法,但未取得成功。這是另一個問題的正確答案。 – zznq

+0

有關':type'參數的部分是這個問題爲我節省了一些頭痛的地方。在Devise docs中對測試沒有很清楚的記錄。 – Matt

相關問題