3

ユーザー認証に Omniauth で Devise (v2.1.2) を使用しています。JSONオブジェクトをPOST本体として使用するコントローラーの機能テストに取り組んでいるため、この質問の手法を使用して生のPOST本体を設定しています。これは開発には問題なく機能しますが、テストを実行すると、完全に認証されていないメソッドで例外が発生します。

NoMethodError: undefined method `user' for nil:NilClass

テスト例:

test "should be able to create an item" do    
  m = FactoryGirl.attributes_for(:item)
  raw_post :create, {}, m.to_json 
  assert_response :success   
end

私のモデルにはuserメソッドがなく、このコントローラーには認証を使用するものがないため、かなり混乱しました。完全なスタック トレースは、Devise のこの関数の最初の行からエラーが発生していることを示しています。

def sign_out_all_scopes(lock=true)
  users = Devise.mappings.keys.map { |s| warden.user(:scope => s, :run_callbacks => false) }

  warden.raw_session.inspect
  warden.logout
  expire_devise_cached_variables!
  warden.clear_strategies_cache!
  warden.lock! if lock

  users.any?
end

したがって、私の機能テスト (および機能テストのみ) では、wardenオブジェクトは nil のように見えます。

  1. 認証されていないリクエストでこの関数が呼び出されるのはなぜですか?
  2. wardenオブジェクトがここに存在しないのはなぜですか?
  3. 修正するにはどうすればよいですか?
4

1 に答える 1

8
  1. わかりません。Devise は独自のことを行っています。
  2. 1を参照してください。
  3. を含めますDevise::TestHelpers

Deviseのドキュメントには、ヘルパーを使用するにはヘルパーを含める必要があると書かれています。ヘルパーを含めないと、 authentication を使用しないものを含め、機能テストが失敗するとは言いませんが、それが起こります。

(最初は問題だと思っていた、ここでの JSON の処理に注意してください。結局、ただのニシンに過ぎませんでした。標準の post または get を使用しても、この問題は発生します。)

于 2012-11-14T03:19:20.093 に答える