Wie kann ich feststellen, GoogleMock zu stoppen prüfen die Erwartung, dass, nachdem der test fertig?
Habe ich zwei unit-tests, die gemeinsam einem Staat (leider kann ich das nicht ändern das da der Punkt ist das testen der Umgang mit diesem Zustand).
TEST(MySuite, test1)
{
shared_ptr<MockObject> first(make_shared<MockObject>());
SubscribeToFooCallsGlobal(first);
EXPECT_CALL(*first, Foo(_));//.RetiresOnSaturation();
TriggerFooCalls(); //will call Foo in all subscribed
}
TEST(MySuite, test2)
{
shared_ptr<MockObject> second(make_shared<MockObject>());
SubscribeToFooCallsGlobal(second);
EXPECT_CALL(*second, Foo(_)).Times(1);
TriggerFooCalls(); //will call Foo in all subscribed
}
Wenn ich die tests separat, beide sind erfolgreich. Wenn ich Sie laufen in der Reihenfolge, test1, test2, bekomme ich die folgende Fehlermeldung in test2:
mytest.cpp(42): error: Mock-Funktion aufgerufen, öfter als erwartet - wieder zu direkt. Aufruf: Foo(0068F65C) Erwartet: auf einmal aufgerufen werden Aktuell: zweimal angerufen - über-gesättigten und aktive
Sich die Erwartung nicht, dass ist die eine in test1. Der Anruf wird stattfinden, aber ich möchte sagen, GoogleMock zu egal nach test1
abgeschlossen ist (in der Tat, ich will nur überprüfen, Erwartungen, in einem test während der test ausgeführt wird).
War ich unter dem Eindruck, dass RetiresOnSaturation
dies zu tun wäre, aber mit ihm bekomme ich:
Unerwartete mock-Funktion Anruf - Rückgabe direkt. Aufruf: Foo(005AF65C) Google Mock habe versucht, die folgenden 1 Erwartung, aber es didn ' T match: mytest.cpp(42): EXPECT_CALL(erste, Foo(_))... Erwartet: die Erwartung ist aktiv Aktuell: es ist im Ruhestand Erwartet: auf einmal aufgerufen werden Aktuell: einmal aufgerufen, gesättigten und im Ruhestand
Muss ich zugeben, verwirrt mich. Was bedeutet es? Wie kann ich dieses Problem lösen?
- ` SubscribeToFooCallsGlobal(erst -); - Sie muss wohl abbestellen am Ende jedes TC.
- Sicher, aber das ist ein workaround. Warum GoogleMock noch überprüfen, den Ruf nach der test lief?
- Weil globals globals sind. Und als solche (die globals) sind Schmerzen in der einen*s - und nichts und niemand (einschließlich gtest) kann richtig viel mit globals
- mein Punkt ist: warum nicht GoogleMock klar die Erwartungen nach einem test Fall ran? Wie kann ich es machen das klar? Für mich macht es keinen Sinn, Sie zu behalten statt, nachdem ein Testfall ausgeführt.
- Ihr spottet, sind immer noch da (gehalten von Ihrem globals als
std::shared_ptr
) - so , wie, nach Ihnen, gmock anerkennen sollen, dürfen Sie nicht teilnehmen, im nächsten test? Mein Punkt ist, dass Sie abonniert haben - so werden Sie genannt - aber Sie erwartet nur einmal aufgerufen werden - Ich meine, im ersten test haben Sie ein Modell gezeichnet. Im 2. test haben Sie 2 mocks abonniert
- Verwenden RAII/ScopeGuard abonniert/unsubscibe Ihr mocks
- "es macht keinen Sinn, Sie zu behalten-in-place" - mein Punkt ist, dass du das bist, Sie sind, halten Sie an Ihrem Platz - nicht gtest/gmock
- Ich bin nicht debattieren, warum es passiert ist (ich bin mir dessen bewusst), sondern vielmehr, warum gmock wie das funktioniert und Fragen, ob es ist ein Weg, um tests unabhängig voneinander laufen. Wenn Sie sagen, dass der einzige Weg, dies zu tun ist durch die Destruktion der mock-Objekte, dann bitte hinzufügen, dass so eine Antwort mit den entsprechenden Unterlagen Teile (die ich nicht zu finden) und ich werde es akzeptieren, es als eine Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen Sie in Dokumentation von Mock fast wörtlich beschrieben Ihrem Fall:
Also man darf nicht erwarten, dass am Ende der test-Fall in irgendeiner magischen Weise Erwartungen wird "deaktiviert". Wie oben zitiert - die mock-Destruktor ist der Punkt der überprüfung.
In Ihrem Fall - Sie spottet, sind keine lokalen Variablen, die Sie erstellt im dynamischen Speicher (heap zitiert doc) und bleiben auf Ihrem getesteten code über
SubscribeToFooCallsGlobal()
, So sicher mock erstellt in einem test ist immer noch lebendig, im nächsten test.Die einfache und richtige Lösung ist zum abbestellen am Ende jedes TC - ich weiß nicht, ob Sie irgendwelche
UnsubscribeToFooCallsGlobal()
- wenn nicht, erstellen Sie eine solche Funktion. Um sicher zu sein, dass es immer genannt - verwenden ScopeGuard Muster.Gibt es eine Funktion, um manuell zu erzwingen überprüfung
Modell::VerifyAndClearExpectations(&mock_object)
- aber verwenden Sie es nur wenn Sie diese Prüfung nicht in die Letzte Zeile Ihres Testfalls, denn das sollte der Punkt der Zerstörung.edit: Behoben, die googlemock link.