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.

Schreibe einen Kommentar