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


132

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

  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

回答:


191

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

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

もう一度ありがとう。


2
実際のURLを(bit.lyではなく)ロギング:考案ページ(github.com/plataformatec/devise)で、「テストヘルパー」セクションを参照してください。
Zabba、2011年

74

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

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

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

私にとって有効な解決策については、https://stackoverflow.com/a/21166482/1161743を参照してください

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

before :each do
  sign_out :user
end

1
また、問題が発生する可能性があるため、Devise :: TestHelpersを複数回インクルードしていないことを確認してください。
Joseph Siefers、2015

8

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

2

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

このスタックオーバーフローの質問への回答からインスピレーションを得て、rspecディレクトリのさまざまな組み合わせを一緒に実行して、相互に干渉している可能性があるものを見つけました。結局、私が電話しているのを発見しました:

before() do #note no :each passed to before
  :
end

これのすべての出現を次のように変更したとき:

before(:each) do
  :
end

すべての仕様は失敗することなく合格しました:

undefined method `authenticate' for nil:NilClass

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


0

ビュースペックを使用している場合は、のスタブを作成できます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

-3

ソースコードにいくつかの更新があるようです。ApplicationControllerは、authenticate_user!リクエストの前にフィルターを実行する必要があることを指定します。このスレッドは、問題に関するいくつかの背景を提供します。

http://groups.google.com/group/plataformatec-devise/browse_thread/thread/f7260ebe2d9f7316?fwc=1

基本的に、このauthenticate_user!関数はRails 3の一部です(devise私がほとんど知らない新機能を使用しています)。アプリが(名前空間の問題または何らかの理由により)Userモデルを見つけられない場合、メソッドは失敗します。リンクした「enki」アプリケーションがRails 3アプリケーションになりました。それが改宗するにつれて、それはいくつかの成長する痛みを経験しているかもしれません。


2
この答えは約99%純粋なナンセンスです。
最大

-20

Rubyはあなたに言っています、その方法#authenticatenilまだ定義されていません。あなたはそれを簡単に行うことができます:

def nil.authenticate!
  puts "Bingo! Nil is now authentic!"
end

そしてエラーはなくなります。


1
これを行わないでください。nilはnilであり、90%のケースで有効なオブジェクトではありません。
Tiago Peczenyj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.