私のテストのほとんどは以下を提起しており、その理由はわかりません。すべてのメソッド呼び出しで「認証」エラーが発生します。 「認証」というメソッドがあった場合、コードをチェックしましたが、そのようなメソッドはありません。
1) Admin::CommentsController handling GET to index is successful
Failure/Error: get :index
undefined method `authenticate!' for nil:NilClass
# ./spec/controllers/admin/comments_controller_spec.rb:9:in `block (3 levels) in <top (required)>'
124) PostsController handling GET for a single post should render show template
Failure/Error: get :show, :year => '2008', :month => '01', :day => '01', :slug => 'a-post'
undefined method `authenticate' for nil:NilClass
# ./app/controllers/application_controller.rb:18:in `set_current_user_for_model'
# ./spec/controllers/posts_controller_spec.rb:131:in `do_get'
# ./spec/controllers/posts_controller_spec.rb:140:in `block (3 levels) in <top (required)>'
プロジェクトはそこにあります=> https://github.com/agilepandas/enki 自分でテストを実行したい場合に備えて。
この質問はTwitterで@MatthewClossonによって回答されました
@jeffehhここに指定されているようにspec/support/devise.rbファイルを作成する必要があります https://github.com/plataformatec/devise#test-helpers deviseテストヘルパー#Rubyを含める
もう一度ありがとう。
Rspecを使用していることは承知していますが、Test::Unit
で同じ問題に遭遇する可能性があります。 test/test_helper.rb
にdeviseテストヘルパーを追加するだけです
class ActiveSupport::TestCase
include Devise::TestHelpers
end
rSpecで
ジェフリーW.が言及したように、彼の 上記の回答 ->で、これをすべてのコントローラーに設定します。
RSpec.configure do |config|
# ...
config.include Devise::TestHelpers, type: :controller
# ...
end
ただし、これが1つの仕様のみに関連する場合、必ずしもすべてのコントローラー仕様に考案ヘルパーを含める必要はなく、1つのコントローラー記述ブロックにこれらのヘルパーを明示的に含めることができます。
require 'spec_helper'
describe MyCoolController
include Devise::TestHelpers
it { }
end
上記の答えは私にはうまくいきませんでした(RSpec 3.1)
私のために働いた解決策については、 https://stackoverflow.com/a/21166482/116174 を参照してください。
変数を設定する前に、匿名ユーザーをログアウトする必要があります。
before :each do
sign_out :user
end
私のプロジェクトの1つで同じ障害が発生していました。 Ruby 2.0.0-p598、Rails 3.2.21、RSpec 2.99。すべての仕様を一緒に実行すると、問題が発生しました。 spec/spec_helper.rbには次のものが含まれています。
RSpec.configure do |config|
# ...
config.include Devise::TestHelpers, type: :controller
# ...
end
失敗した各仕様ファイルの最初の記述に次を追加しました。これは問題を解決しませんでした:
before :each do
sign_out :user
end
どちらもしませんでした:
after :each do
sign_out :user
end
this stackoverflowの質問への答えからインスピレーションを得て、rspecディレクトリのさまざまな組み合わせを一緒に実行して、どのディレクトリが互いに干渉する可能性があるかを見つけました。最後に、私は電話をしていたことがわかりました:
before() do #note no :each passed to before
:
end
このすべての出現を次のように変更したとき:
before(:each) do
:
end
すべての仕様は失敗せずに合格しました。
undefined method `authenticate' for nil:NilClass
これが他の人の助けになることを願っています。
ビュー仕様で作業している場合は、current_user
。これにより、current_user
返されたものでビューから呼び出されたヘルパー。 rspec-3.2.3の使用方法は次のとおりです。
RSpec.describe "projects/show", type: :view do
before(:each) do
allow(view).to receive(:current_user).and_return(FactoryGirl.create(:user))
end
it "renders attributes in <p>" do
render
expect(rendered).to match(/whatever you want to regex match here/)
end
end