25 Stimmen

Warum erhalte ich einen Fehler mit der ungeklärten Methode "have", wenn ich Rspec ausführe?

Ich habe kürzlich auf Rails 4 aktualisiert und alles funktioniert gut, außer meinen Rspec-Tests.

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 "hat eine gültige Factory" do
    expect(FactoryGirl.build(:invoice, :project => @project, :user => @user)).to be_valid
  end

  it "ist ungültig ohne eine Nummer" do
    expect(FactoryGirl.build(:invoice, :project => @project, :user => @user, :number => nil)).to have(1).errors_on(:number)
  end

end

Beim Ausführen dieser Tests erhalte ich diesen Fehler:

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

Kann mir jemand sagen, was mir hier fehlt?

Ich habe bereits gegoogelt, aber nichts kam dabei heraus. Die have Methode ist tatsächlich ziemlich standardmäßig in Rspec und ich kann nicht sehen, warum sie nicht funktionieren sollte.

Danke für jegliche Hinweise.

49voto

Peter Alfvin Punkte 28207

Die have-Familie von Matchern wurde in RSpec 2.99 veraltet und wurde als separates rspec-collection_matchers-Gem in RSpec 3.0 verschoben. Dies wird in https://rspec.info/blog/2013/11/rspec-2-99-and-3-0-betas-have-been-released/ diskutiert, wo auch der empfohlene Ansatz zur Migration auf 3.0 erläutert wird. Speziell wird empfohlen, RSpec 2.99 zu installieren/zu verwenden, um die Veraltungs-Nachrichten zu sehen, die mit Elementen verbunden sind, die in 3.0 entfernt/verschoben wurden.

5voto

Purkhalo Alex Punkte 2617

In den neuesten Versionen von rspec wird "have" zwar als veraltet angesehen, aber du kannst es immer noch über das rspec-collection_matchers Gem nutzen.

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

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

1voto

Tintin81 Punkte 9242

OK, verstanden.

Ich hatte die falsche Versionsnummer in meiner Gemfile.

Vorher:

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

Nachher:

gem 'rspec-rails'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X