我正在使用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对象是nil。
为什么对未经身份验证的请求调用此函数?
为什么这里不存在warden对象?
我能做什么来修理它?

最佳答案

不知道,设计是在做自己的事情。
见1。
包括Devise::TestHelpers
Devise documentation表示需要包含助手才能使用它们。它并没有说,如果不包括帮助程序,那么功能测试将失败,包括那些不使用任何身份验证的功能测试,但这就是发生的情况。
(请注意这里的json处理,我最初认为是问题所在,但最终只是一个问题。即使使用标准的post或get,您也会遇到这个问题。)

07-24 09:49
查看更多