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方法,这个控制器中没有任何东西使用身份验证,所以我很困惑。完整的堆栈跟踪显示错误来自设计中此函数的第一行:

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为零。

  1. 为什么在未经身份验证的请求上调用此函数?
  2. 为什么这里不warden存在对象?
  3. 我能做些什么来修复它?
4

1 回答 1

8
  1. 不知道,Devise 正在做自己的事情。
  2. 见 1。
  3. 包括Devise::TestHelpers.

设计文档说您需要包含帮助程序才能使用它们。它并不是说如果您不包含帮助程序,您的功能测试将失败,包括那些不使用任何身份验证的测试,但这就是发生的情况。

(注意这里的 JSON 处理,我最初认为是问题,最终只是一个红鲱鱼。即使使用标准 post 或 get 你也会遇到这个问题。)

于 2012-11-14T03:19:20.093 回答