我最近升级了我的Rails 4应用程序的RSpec版本。这是我的设置:
# /Gemfile:
source 'https://rubygems.org'
group :development, :test do
gem 'rspec-rails', '~> 2.99'
...
end
# /spec/controllers/companies_controller_spec.rb:
require 'spec_helper'
describe CompaniesController, :type => :controller do
before(:all) do
@user = FactoryGirl.create(:user)
sign_in(@user)
end
describe 'GET #new' do
it "renders the :new view" do
get :new
expect(response).to render_template :new
end
end
...
end
# /spec/support/utilities.rb:
def sign_in(user)
cookies[:remember_token] = user.remember_token
end
问题在于,我的大多数测试现在都失败了,而且我已经尝试将其修复数小时,但无济于事。
这是几乎所有需要user
登录的测试的错误:
Failure/Error: sign_in(@user)
NoMethodError:
undefined method `cookie_jar' for nil:NilClass
# ./spec/support/utilities.rb:2:in `sign_in'
然而,@user
对象由FactoryGirl创建。我已经在测试数据库和日志中检查了它。
为什么我的登录用户方法不起作用?
在升级到更高版本的RSpec之前,它就像一个魅力。
感谢您的帮助。
答案 0 :(得分:2)
在before(:all)
中,你不应该做的只是在一个例子的背景下才有意义的东西。
特别是您的sign_in
方法会使用Cookie,这隐含了当前请求/控制器的Cookie。这在before(:all)
中没有意义,因为每个示例都应该有一个单独的请求 - 因为没有当前请求而发生异常。将before(:all)
更改为before(:each)
,您应该没问题。
Rspec曾经在这方面更宽松,但2.99收紧了这一点,在一些早期的2.x版本中也增加了类似用途的弃用警告(如果你有关于使用let / subject之前的折旧( :all)阻止,就是这样)