升级到RSpec 2.99后,为什么我的控制器登录实用程序不再工作?

时间:2014-06-16 09:54:58

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

我最近升级了我的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之前,它就像一个魅力。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

before(:all)中,你不应该做的只是在一个例子的背景下才有意义的东西。

特别是您的sign_in方法会使用Cookie,这隐含了当前请求/控制器的Cookie。这在before(:all)中没有意义,因为每个示例都应该有一个单独的请求 - 因为没有当前请求而发生异常。将before(:all)更改为before(:each),您应该没问题。

Rspec曾经在这方面更宽松,但2.99收紧了这一点,在一些早期的2.x版本中也增加了类似用途的弃用警告(如果你有关于使用let / subject之前的折旧( :all)阻止,就是这样)