Rails3:功能测试失败,NoMethodError:未定义的方法`user'代表nil:NilClass

pol*_*m23 3 ruby functional-testing devise ruby-on-rails-3

我正在使用Devise(v2.1.2)与Omniauth进行用户验证.我正在为一个控制器进行功能测试,该控制器将JSON对象作为POST主体,因此使用此问题中的技术来设置原始POST主体.这适用于开发,但是当我运行测试时,我得到一个完全未经验证的方法的异常:

NoMethodError: undefined method `user' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

示例测试:

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

我的模型都没有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
Run Code Online (Sandbox Code Playgroud)

所以看起来在我的功能测试中(并且只在我的功能测试中)warden对象是零.

  1. 为什么在未经身份验证的请求中调用此函数?
  2. 为什么warden这里不存在物体?
  3. 我该怎么办才能修复它?

pol*_*m23 8

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

设计文档说,你需要包括以使用它们的帮手.它并没有说如果你没有包含帮助器,你的功能测试将会失败,包括那些不使用任何身份验证,但这就是发生的事情.

(注意这里的JSON处理,我最初认为是问题,最后只是一个红色的鲱鱼.即使有标准的帖子或得到你将有这个问题.)