web-dev-qa-db-ja.com

すべてRubyテスト発生:nil:NilClassの未定義メソッド `authenticate '

私のテストのほとんどは以下を提起しており、その理由はわかりません。すべてのメソッド呼び出しで「認証」エラーが発生します。 「認証」というメソッドがあった場合、コードをチェックしましたが、そのようなメソッドはありません。

  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 自分でテストを実行したい場合に備えて。

129
Jeffrey W.

この質問はTwitterで@MatthewClossonによって回答されました

@jeffehhここに指定されているようにspec/support/devise.rbファイルを作成する必要があります https://github.com/plataformatec/devise#test-helpers deviseテストヘルパー#Rubyを含める

もう一度ありがとう。

190
Jeffrey W.

Rspecを使用していることは承知していますが、Test::Unitで同じ問題に遭遇する可能性があります。 test/test_helper.rbにdeviseテストヘルパーを追加するだけです

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
72
Tim Fletcher

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
7
equivalent8

上記の答えは私にはうまくいきませんでした(RSpec 3.1)

私のために働いた解決策については、 https://stackoverflow.com/a/21166482/116174 を参照してください。

変数を設定する前に、匿名ユーザーをログアウトする必要があります。

before :each do
  sign_out :user
end
7
Jonathan Lin

私のプロジェクトの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

これが他の人の助けになることを願っています。

1
Cathal Curtis

ビュー仕様で作業している場合は、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
0
Pete