web-dev-qa-db-ja.com

Rspecを実行しているときに未定義のメソッド 'have'エラーが発生するのはなぜですか?

最近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でかなり標準的であり、なぜそれが機能しないのかわかりません。

ポインタをありがとう。

21
Tintin81

マッチャーのhaveファミリーは、RSpec 2.99で非推奨になり、RSpec 3.0以降、別の rspec-collection_matchers gemに移動されました。これについては http://myronmars.to/n/dev-blog/2013/11/rspec-2-99-and-3-0-betas-have-been-released で説明されています。また、3.0に移行するための推奨アプローチも示しています。具体的には、3.0で削除/移動されたアイテムに関連する非推奨メッセージを表示するために、RSpec2.99をインストール/使用することをお勧めします。

46
Peter Alfvin

Rspecの最新バージョンでは非推奨になっていますが、それでも rspec-collection_matchers gemを介して使用できます。

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

# spec/spec_helper.rb
...
require 'rspec/collection_matchers'
....
5
Purkhalo Alex

はい、わかった。

Gemfileのバージョン番号が間違っていました。

前:

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

後:

gem 'rspec-Rails'
1
Tintin81