Verwenden von Moq und angeschaut, Callback
aber ich konnte kein einfaches Beispiel finden, um zu verstehen, wie man es verwendet.
Haben Sie einen kleinen Arbeitsausschnitt, der klar erklärt, wie und wann Sie ihn verwenden sollen?
Schwer zu schlagen https://github.com/Moq/moq4/wiki/Quickstart
Wenn das nicht klar genug ist, würde ich das einen Doc-Fehler nennen ...
EDIT: Als Antwort auf Ihre Klarstellung ...
Für jede verspottete Methode, die Setup
Sie ausführen, können Sie Folgendes angeben:
Der .Callback
Mechanismus sagt: "Ich kann es momentan nicht beschreiben, aber wenn ein Anruf in dieser Form auftritt, rufen Sie mich zurück und ich werde tun, was getan werden muss." Als Teil derselben fließenden Aufrufkette können Sie das Ergebnis steuern, das (falls vorhanden) über .Returns
"zurückgegeben werden soll. In den QS-Beispielen wird beispielsweise der zurückgegebene Wert jedes Mal erhöht.
Im Allgemeinen benötigen Sie einen solchen Mechanismus nicht sehr oft (xUnit-Testmuster enthalten Begriffe für Antimuster der ilk Conditional Logic In Tests), und wenn es eine einfachere oder integrierte Methode gibt, um festzustellen, was Sie benötigen, sollte dies der Fall sein bevorzugt verwendet.
Teil 3 von 4 in Justin Etheredges Moq-Serie behandelt es, und hier gibt es ein weiteres Beispiel für Rückrufe
Ein einfaches Beispiel für einen Rückruf finden Sie unter Verwenden von Rückrufen mit Moq- Post.
Callback
hat nichts mit dem Rückgabewert zu tun (es sei denn, Sie verknüpfen es zufällig über Code). Grundsätzlich wird nur sichergestellt, dass der Rückruf vor oder nach jedem Aufruf aufgerufen wird (je nachdem, ob Sie ihn vor oder nach dem Aufruf verkettetReturns
haben).Hier ist ein Beispiel für die Verwendung eines Rückrufs zum Testen einer Entität, die an einen Datendienst gesendet wurde, der eine Einfügung verarbeitet.
Alternative generische Methodensyntax:
Dann können Sie so etwas testen
quelle
It.Is<T>
in einem zu verwenden,Mock.Verify
anstatt den Test mit Zeitarbeitskräften zu verschmutzen. Aber +1, weil ich wette, dass es viele Leute gibt, die anhand eines Beispiels am besten funktionieren.Es gibt zwei Arten von
Callback
in Moq. Eine passiert, bevor der Anruf zurückkehrt; Das andere geschieht, nachdem der Anruf zurückgekehrt ist.In beiden Rückrufen können wir:
quelle
Callback
ist einfach ein Mittel, um einen beliebigen benutzerdefinierten Code auszuführen, wenn eine der Methoden des Mocks aufgerufen wird. Hier ist ein einfaches Beispiel:Ich bin kürzlich auf einen interessanten Anwendungsfall gestoßen. Angenommen, Sie erwarten einige Anrufe bei Ihrem Mock, die jedoch gleichzeitig stattfinden. Sie haben also keine Möglichkeit, die Reihenfolge zu kennen, in der sie angerufen werden, aber Sie möchten wissen, welche Anrufe Sie erwartet haben (unabhängig von der Reihenfolge). Sie können so etwas tun:
Übrigens, lassen Sie sich nicht durch die irreführende Unterscheidung "vor
Returns
" und "nachReturns
" verwirren . Es ist lediglich eine technische Unterscheidung, ob Ihr benutzerdefinierter Code nachReturns
oder vor der Auswertung ausgeführt wird. In den Augen des Anrufers werden beide ausgeführt, bevor der Wert zurückgegeben wird. In der Tat, wenn die Methodevoid
zurückkehrt, können Sie nicht einmal aufrufenReturns
und dennoch funktioniert es genauso. Weitere Informationen finden Sie unter https://stackoverflow.com/a/28727099/67824 .quelle
Zusätzlich zu den anderen guten Antworten hier habe ich damit Logik ausgeführt, bevor eine Ausnahme ausgelöst wurde. Zum Beispiel musste ich alle Objekte speichern, die zur späteren Überprüfung an eine Methode übergeben wurden, und diese Methode musste (in einigen Testfällen) eine Ausnahme auslösen. Der Aufruf
.Throws(...)
anMock.Setup(...)
Überschreibungen derCallback()
Aktion und nie nennt. Wenn Sie jedoch eine Ausnahme innerhalb des Rückrufs auslösen, können Sie immer noch alle guten Dinge tun, die ein Rückruf zu bieten hat, und dennoch eine Ausnahme auslösen.quelle