2012-11-14 26 views
3

我正在使用Devise(v2.1.2)和Omniauth进行用户验证。我正在为一个控制器进行功能测试,该控制器将JSON对象作为POST主体,因此使用this question中的技术来设置原始POST主体。这对于开发工作正常,但是当我运行测试中,我得到一个方法的异常是完全未经验证:Rails3:功能测试失败,出现NoMethodError:未定义的方法`user'for nil:NilClass

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. 我能做些什么来解决它?

回答

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

Devise documentation表示您需要包含助手才能使用它们。它并没有说如果你不包括助手,你的功能测试将失败,包括那些不使用任何认证,但这就是发生了什么。

(注意JSON处理在这里,我原本以为这个问题,结束了仅仅是一个红鲱鱼。即使有标准后或得到你就会有这个问题。)

+0

https://github.com/plataformatec/devise#test-helpers这是为我做的 –

相关问题