ユーザー認証に 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 のように見えます。
- 認証されていないリクエストでこの関数が呼び出されるのはなぜですか?
warden
オブジェクトがここに存在しないのはなぜですか?- 修正するにはどうすればよいですか?