为什么在运行 Rspec 时出现未定义方法“有”错误?

问题描述 投票:0回答:3

我最近升级到 Rails 4,除了我的 Rspec 测试外,一切正常。

require 'spec_helper'

describe Invoice do

  before :each do
    @user = FactoryGirl.create(:activated_user)
    person = FactoryGirl.create(:person, :user => @user, :company => nil)
    @project = FactoryGirl.create(:project, :user => @user, :person_ids => [person.id], :invoice_recipient_id => person.id)
  end

  it "has a valid factory" do
    expect(FactoryGirl.build(:invoice, :project => @project, :user => @user)).to be_valid
  end

  it "is invalid without a number" do
    expect(FactoryGirl.build(:invoice, :project => @project, :user => @user, :number => nil)).to have(1).errors_on(:number)
  end

end

运行这些测试时出现此错误:

Failure/Error: expect(FactoryGirl.build(:invoice, :project => @project, :user => @user, :number => nil)).to have(1).errors_on(:number)
NoMethodError:
undefined method `have' for #<RSpec::ExampleGroups::Invoice_2:0x009ge29360d910>
# ./spec/models/invoice_spec.rb:16:in `block (2 levels) in <top (required)>'

有人能告诉我我在这里缺少什么吗?

我已经在谷歌上搜索过了,但什么也没有。

have
方法在 Rspec 中实际上是相当标准的,我不明白为什么它不应该工作。

感谢任何指点。

ruby-on-rails rspec ruby-on-rails-4 factory-bot
3个回答
49
投票

have
匹配器系列在 RSpec 2.99 中被弃用,并已从 RSpec 3.0 移至单独的 rspec-collection_matchers gem。这在 https://rspec.info/blog/2013/11/rspec-2-99-and-3-0-betas-have-been-released/ 中进行了讨论,它还提供了迁移到的建议方法3.0。具体来说,它建议安装/使用 RSpec 2.99,以便查看与 3.0 中删除/移动的项目相关的弃用消息。


5
投票

在最新版本的 rspec“have”被弃用,但您仍然可以通过 rspec-collection_matchers gem 使用它。

# Gemfile
...
gem 'rspec-collection_matchers', group: :test
...

# spec/spec_helper.rb
...
require 'rspec/collection_matchers'
....

1
投票

好的,明白了

我的 Gemfile 中有错误的版本号。

之前:

gem 'rspec-rails', '~> 3.0.0.beta'

之后:

gem 'rspec-rails'
© www.soinside.com 2019 - 2024. All rights reserved.