Wie überprüfe ich, ob eine Methode mit Moq genau einmal aufgerufen wurde? Das Verify()
vs. Verifable()
Ding ist wirklich verwirrend.
111
Sie können verwenden Times.Once()
, oder Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
Hier sind die Methoden für die Times- Klasse:
AtLeast
- Gibt an, dass eine verspottete Methode mindestens mal aufgerufen werden soll.AtLeastOnce
- Gibt an, dass eine verspottete Methode mindestens einmal aufgerufen werden soll.AtMost
- Gibt an, dass eine verspottete Methode maximal mal aufgerufen werden soll.AtMostOnce
- Gibt an, dass eine verspottete Methode maximal einmal aufgerufen werden soll.Between
- Gibt an, dass eine verspottete Methode zwischen von und bis zu Zeiten aufgerufen werden soll.Exactly
- Gibt an, dass eine verspottete Methode genau mal aufgerufen werden soll.Never
- Gibt an, dass eine verspottete Methode nicht aufgerufen werden soll.Once
- Gibt an, dass eine verspottete Methode genau einmal aufgerufen werden soll.Denken Sie daran, dass es sich um Methodenaufrufe handelt. Ich stolperte immer wieder, dachte, sie seien Eigenschaften und vergaß die Klammern.
var mockContext = new Mock<IContext>()
das einzurichten.AtLeast
,AtMost
,Between
oderExactly
als Objekt angesehen werden könnten. Ich meine, sie brauchen einen Parameter, um etwas zu tun.Stellen Sie sich vor, wir bauen einen Taschenrechner mit einer Methode zum Hinzufügen von 2 ganzen Zahlen. Stellen wir uns weiter vor, die Anforderung besteht darin, dass beim Aufrufen der add-Methode die print-Methode einmal aufgerufen wird. So würden wir das testen:
Und hier ist der eigentliche Test mit Kommentaren im Code zur weiteren Verdeutlichung:
Hinweis : Standardmäßig stoppt Moq alle Eigenschaften und Methoden, sobald Sie ein Mock-Objekt erstellen. Auch ohne Aufruf
Setup
hat Moq die Methoden bereits blockiert,IPrinter
sodass Sie einfach aufrufen könnenVerify
. Als bewährte Methode habe ich sie jedoch immer eingerichtet, da wir möglicherweise die Parameter für die Methode erzwingen müssen, um bestimmte Erwartungen zu erfüllen, oder den Rückgabewert der Methode, um bestimmte Erwartungen zu erfüllen, oder die Häufigkeit, mit der sie aufgerufen wurde.quelle
Verify
,Times.Once
ohne jemals anzurufenSetup
. Ich würde sicherlich erwartenVerify
, in diesem Fall in die Luft zu jagen, aber das tat es nicht.Mock
Objekt erstellen . Auch ohne AufrufSetup
hat Moq die Methoden bereits blockiert,IPrinter
sodass Sie einfach aufrufen könnenVerify
. Als gute Vorgehensweise habe ich es jedoch immer eingerichtet, da wir möglicherweise die Parameter für die Methode oder den Rückgabewert der Methode erzwingen müssen.Times.Exactly(1)
und es ist nicht fehlgeschlagen, als die Methode tatsächlich zweimal aufgerufen wurde. Erst nach dem HinzufügenSetup
für die betreffende Methode ist sie korrekt fehlgeschlagen.Testcontroller kann sein:
Und wenn die DeleteCars-Methode mit einer gültigen ID aufgerufen wird, können wir überprüfen, ob die Dienstentfernungsmethode bei diesem Test genau einmal aufgerufen wurde:
quelle