2012-01-25 21 views
7

私はここに掲載された同様のエラーがありますが、すべて問題を解決できません。rspec統合テストとデバッグスローNoMethodErrorエラー

マイファイル '仕様/要求/ news_controller_spec.rb' を次のようになります。私は、テストを実行する場合

require 'spec_helper' 

describe "NewsController" do 

    include Devise::TestHelpers 

    describe "GET /news" do 

    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     @user = Factory.create(:user) 
     @user.confirm! 
     sign_in @user 
    end 

    it "after login should show the latest news an screen" do 
     page.should have_content("News") 
    end 
    end 
end 

は私が買ってあげる:

Failures: 

    1) Campaigns GET /news works! 
    Failure/Error: Unable to find matching line from backtrace 
    NoMethodError: 
     undefined method `env' for nil:NilClass 
    # /Users/.../gems/devise-1.5.3/lib/devise/test_helpers.rb:25:in `setup_controller_for_warden' 
    # /Users/.../gems/rspec-rails-2.8.1/lib/rspec/rails/adapters.rb:15:in `block (2 levels) in setup' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in `instance_eval' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:35:in `run_in' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `block in run_all' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `each' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:70:in `run_all' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/hooks.rb:368:in `run_hook' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `block in run_before_each_hooks' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `each' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:292:in `run_before_each_hooks' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:217:in `run_before_each' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:79:in `block in run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:173:in `with_around_hooks' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example.rb:77:in `run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:355:in `block in run_examples' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in `map' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:351:in `run_examples' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:337:in `run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `block in run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `map' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:338:in `run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `map' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:28:in `block in run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/reporter.rb:34:in `report' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:25:in `run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in `run_in_process' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in `run' 
    # /Users/.../gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:10:in `block in autorun' 

は、私がhttps://github.com/plataformatec/devise/wiki/How-To%3a-Controllers-and-Views-tests-with-Rails-3-%28and-rspec%29と類似した他の指示に従っここで質問しますが、私は解決策を見つけることができません。 、

  • カピバラ(1.1.2)
  • 工夫(1.5.3)
  • factory_girl_rails(1.6.0)
  • レール(3.2.0:

    私は、次のgemsetを使用しています3.1.1)

  • RSpecの(2.8.0)
  • RSpecのコア(2.8.0)
  • RSpecの-期待(2.8.0)
  • RSpecの、モック(2.8.0)
  • RSpecのレール(2.8.1)

およびいくつかの他の宝石。

ログインしたユーザーとの統合テストを手伝ってもらえますか?この場合、ニュースはユーザーがログインしている場合にのみ表示されます。

ありがとうございました。

+0

は、あなたが 'テスト:: Unit'と' RSpec'構成を混同していませんか? * rspec-rails-2.0.0およびdevise-1.1の時点で、スペックに考慮する最良の方法は、単にspec_helperに以下を追加することです:* https://gist.github.com/1682113 – jibiel

+0

私はそう望みます。私はファイル_spec/support/devise.rb_を持っていて、このファイルに 'RSpec.configure do | config | config.include Devise :: TestHelpers、:type =>:コントローラ 終了 '。サポートディレクトリ内のファイルは 'Dir [Rails.root.join(" spec/support/**/*。rb ")]によってインクルードされなければなりません。 f} 'が必要です。右? –

+0

http://stackoverflow.com/questions/6725169/testing-models-with-rspec-using-devise ':type =>:controller'の部分は間違いなく忘れました。ちょうどそれを削除し、同じエラーが発生しました。 – jibiel

答えて

9

私は実際にはまったく同じ問題を抱えていた、と少しグーグルた後、私はそれは、プログラムだけでこのような/アウトユーザーでサイン以来Warden::Test::Helpersを含むことは、直接、要求仕様のため、より簡潔なソリューションであることがわかった:

# spec/support/request_helpers.rb 
require 'spec_helper' 
include Warden::Test::Helpers 

module RequestHelpers 
    def create_logged_in_user 
    user = Factory(:user) 
    login(user) 
    user 
    end 

    def login(user) 
    login_as user, scope: :user 
    end 
end 

要するに、Warden::Test::Helpersを含めてからlogin_as <your_user>メソッドを使用してください。それだけです!ここから取ら

ソリューション:http://simple10.com/rspec-capybara-devise-login-tests/

+2

また、Devise :: TestHelpersはコントローラクラスを記述している場合にのみ機能します: NewsControllerを記述する代わりに...記述する "NewsController" –