2015-02-09 18 views
19

Ich möchte meine User Modelle Verein has_many :projects, dependent: :destroy testen und so weit jetzt gegangen sind:So testen Sie abhängig:: mit RSpec zerstören?

it "destroys dependent projects" do 
    user = FactoryGirl.build(:user) 
    project = FactoryGirl.build(:project) 

    user.projects << project 
    user.destroy 

    expect(Project.count).to change(-1) 
end 
einen Fehler

aber das gibt aus:

Failure/Error: expect(Project.count).to change(-1) 
    ArgumentError: 
     `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message. 

so nehme ich an, dass change nicht ist der richtige Matcher, oder? Können Sie mir bitte sagen, wie ich diesen Test schreiben könnte, ohne diesen Fehler zu bekommen?

Antwort

24

Es ist die richtige Matcher, aber Sie verwenden sie den richtigen Weg nicht:

  • Bedürfnisse erwarten einen Block enthält, um die Aktion erhalten auszuführen (In Ihrem Fall löscht der Benutzer)
  • Änderung muss einen Block erhalten, der den numerischen Wert erzeugt, der sich ändern soll (er kann auch ein Objekt und ein Symbol erhalten, das angibt, dass rspec die benannte Methode aufrufen soll)

Der richtige Weg ist

expect { user.destroy }.to change { Project.count } 

Dies ist nur behauptet, dass der Zahlenwert ändert, aber nicht angibt, um wie viel. Um das zu tun, die Kette um einen Anruf zu by:

expect { user.destroy }.to change { Project.count }.by(-1) 
2

Dies sollte funktionieren:

expect { user.destroy }.to change { Project.count }.by(-1) 
3

Sie sollten für die Entfernung des aktuellen Projektes testen.

expect(Project.all).not_to include project 
23

Sie auch shoulda können Matcher:

it { expect(user).to have_many(:projects).dependent(:destroy) } 

https://github.com/thoughtbot/shoulda-matchers

+1

ist abhängig Fehler als nicht definierte Methode zeigt .. – indb

+0

Sie sollten shoulda Matcher in spec_helper sind: 'require‚shoulda/Matcher '', weitere Informationen zu abhängigen: https://github.com/thoughtbot/shoulda -matchers/blob/master/lib/shoulda/matchers/active_record/association_matcher.rb#L147-L182 – santuxus

+0

Gibt es eine andere Lösung eher mit shofa -Matchers Edelstein? – indb