2008-10-28 7 views
26

In meinem Rails-Controller erstelle ich mehrere Instanzen derselben Modellklasse. Ich möchte einige RSpec-Erwartungen hinzufügen, damit ich testen kann, ob es die richtige Zahl mit den richtigen Parametern erzeugt. So, hier ist das, was ich in meinem spec haben:Wie kann ich mithilfe von RSpec mehrere sust_receive-Erwartungen an ein Objekt hinzufügen?

 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => @user.id, :position_id => 1, :is_leader => true) 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "2222", :position_id => 2) 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "3333", :position_id => 3) 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "4444", :position_id => 4) 

Diese Probleme verursacht, weil es scheint, dass die Bandmate Klasse nur 1 haben kann „should_receive“ Erwartung auf sie gesetzt. Also, wenn ich das Beispiel laufen lasse, erhalte ich folgende Fehlermeldung:

 
Spec::Mocks::MockExpectationError in 'BandsController should create all the bandmates when created' 
Mock 'Class' expected :create with ({:band_id=>1014, :user_id=>999, :position_id=>1, :is_leader=>true}) but received it with ({:band_id=>1014, :user_id=>"2222", :position_id=>"2"}) 

Das sind die richtigen Parameter für den zweiten Aufruf zu schaffen, aber RSpec testet gegen die falschen Parameter.

Weiß jemand, wie ich meine sent_receive-Erwartungen einrichten kann, um mehrere verschiedene Anrufe zu ermöglichen?

+0

Das sollte funktionieren. Welche Version von RSpec verwenden Sie? Versuchen Sie, die stubed-Methoden der Reihe nach aus der Spezifikation aufzurufen (Bandmate.create (...: user_id => @ user.id ...); Bandmate.create (...: user_id => "2222" ...); ...) und sehen, ob es funktioniert. –

Antwort

34

Mehrere Erwartungen sind überhaupt kein Problem. Worauf Sie gerade stoßen, sind Probleme zu bestellen, wenn Sie Ihre speziellen Argumente für ungeordnete Erwartungen haben. Details zur Bestellung finden Sie unter this page.

Die Kurzgeschichte ist, dass Sie .ordered am Ende jeder Ihrer Erwartungen hinzufügen sollten.

+0

Huh, es funktioniert jetzt auch ohne Fehler. Ich vermute, dass ich einen Fehler in meinem Code hatte und es RSpec vorwarf. Danke für den Tipp! – Micah

+0

Link ist 404 auf Github – xxjjnn

+0

Alte Seite hat 404. Ich glaube, es ist dies jetzt: http://rspec.info/documentation/3.3/rspec-mocks/#Ordering – AmitA

-1

Mock Receive Counts

my_mock.should_receive (: SYM) .Sobald
my_mock.should_receive (: SYM) .twice
my_mock.should_receive (: SYM) .exactly (n) ×
my_mock.should_receive (: SYM) .at_least (einmal)
my_mock.should_receive (: SYM) .at_least (: zweimal)
my_mock.should_receive (: SYM) .at_least (n) ×
my_mock.should_receive (: SYM) .at_most (: einmal)
my_m ock.should_receive (: SYM) .at_most (: zweimal)
my_mock.should_receive (: SYM) .at_most (n) ×
my_mock.should_receive (: SYM) .any_number_of_times

Works für rspec 2.5 zu.

+14

behandelt nicht die verschiedenen Argumente, die für jeden Aufruf empfangen werden müssen. – sevenseacat

+1

Wie machst du es mit verschiedenen Argumenten? –

Verwandte Themen