Rails 4 + Rspec + Devise:用户sign_in的控制器规范中未定义的方法'env'

时间:2013-10-21 08:34:53

标签: ruby-on-rails ruby rspec devise ruby-on-rails-4

在我的spec_helper.rb中,我添加了

config.include Devise::TestHelpers, :type => :controller

在之前的控制器规范中:所有钩子我试图使用此代码登录用户

 @request.env["devise.mapping"] = Devise.mappings[:user]
 user = FactoryGirl.create(:confirmed_user)
 sign_in user

并获取NoMethodError:nil的未定义方法`env':NilClass。

有什么想法吗?

4 个答案:

答案 0 :(得分:15)

我已将before(:all)更改为before(:each),现在可以正常使用了。看起来devise(使用github主分支)和rspec 2.14.1之间的API不兼容。

答案 1 :(得分:1)

如果您正在为Devise的内部控制器编写规范,请注释掉@request.env["devise.mapping"] = Devise.mappings[:user]行。参考Devise docs中的测试助手部分。

答案 2 :(得分:0)

控制器规范中将包含一个请求对象。您应该从@request更改为请求..

 request.env["devise.mapping"] = Devise.mappings[:user]

答案 3 :(得分:0)

@request.env["devise.mapping"] = Devise.mappings[:user] 仅在您测试设计控制器或从设计控制器继承的控制器时才需要,如设计 documentation 中所述:

<块引用>

如果您正在测试 Devise 内部控制器或继承自 Devise 的控制器,您需要在请求之前告诉 Devise 应该使用哪个映射。这是必要的,因为 Devise 从路由器获取此信息,但由于控制器测试不通过路由器,因此需要明确说明。

如果您不是上述情况,则无需添加。 如果您属于上述情况,但 @requestnil,请尝试将这些帮助程序添加到您的 rails_helper.rb

  config.include Devise::Test::ControllerHelpers, type: :controller