我正在使用Devise(v2.1.2)和Omniauth进行用户验证。我正在为一个控制器进行功能测试,该控制器将JSON对象作为POST主体,因此使用this question中的技术来设置原始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
对象为零。
warden
对象?答案 0 :(得分:8)
Devise::TestHelpers
。Devise documentation表示您需要包含帮助程序才能使用它们。它并没有说如果你没有包含帮助器,你的功能测试将会失败,包括那些不使用任何身份验证的,但这就是发生的事情。
(注意这里的JSON处理,我最初认为是问题,最后只是一个红色的鲱鱼。即使有标准的帖子或得到你也会遇到这个问题。)