7

新しいアクションを表示するにはユーザーがログインする必要があるリソースがあります。ユーザーがログインせずに新しいリソースを作成しようとすると、ログイン ページにリダイレクト (302) されます。私の機能テストは次のようになります。

  test "should not get new unless logged in" do
    get :new
    assert_response :redirect
  end

スタックトレースは次のようになります。

ArgumentError: uncaught throw :warden
    /.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw'
    /.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!'
    /.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!'

新しいアクションの前に、authenticate_user への before_filter があります。

なぜauthenticate_userなのか理解できました!失敗していますが、なぜエラーがスローされるのか理解できません。つまり、webapp と同じように動作するべきではありません。ユーザーをログインページにリダイレクトしますか?

ありがとう。

4

4 に答える 4

2

これは、Warden および/または Devise のインクルージョンが見つからないか、適切な場所に追加されていない場合に発生します。それらを test_helper.rb に追加したくなるのは、ヘルパーが通常そこに移動する場所だからですが、それは Devise では適切に機能しません。

詳細については、 https://github.com/plataformatec/devise/issues/1029を参照してください。

この問題を解決するには、コントローラーのテスト クラスに Devise ヘルパーと Warden ヘルパーの両方を次のように含めます。

require 'test_helper'                                  
class UserControllerTest < ActionController::TestCase  
  include Devise::TestHelpers                          
  include Warden::Test::Helpers                        
  Warden.test_mode!                                    

  def teardown                                         
    Warden.test_reset!                                 
  end                                                  

  # test "the truth" do                               
  #   assert true
  # end
end

これは、Devise の認証を使用するすべてのコントローラーに必要です。

編集: 以下のコメントで述べたように、include Warden:TestHelpersspec_helper.rb (または test_helper.rb) から rails_helper.rb への移動も機能します。

于 2013-12-22T02:05:31.060 に答える
1

このエラーが発生しましたがinclude Devise::TestHelpers、クラス定義の外側に配置したためです。

require 'test_helper'
include Devise::TestHelpers

class Admin::ObservationsControllerTest < ActionController::TestCase
  setup do
  ...

これにより、7 つのテスト ケースのうち 3 つのケースでウォーデン エラーがスローされました。クラス定義内を移動すると、includeすべてが修正されました。

于 2016-07-27T15:46:50.010 に答える
0

これは古い質問であることはわかっていますが、Devise wiki の答えを見つけました

https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara

これには、ここで再作成するには複雑すぎる段階的なガイドがありますが、最初のステップは、Warden テスト ヘルパーを含めることです。

include Warden::Test::Helpers
Warden.test_mode!

お役に立てれば

于 2013-07-23T17:42:12.033 に答える