Mit moq, um zu überprüfen, ein Aufruf einer Funktion mit Parameter param
Ich habe eine ILogger-Schnittstelle mit LogTrace(string-Wert, params object[] parameters). Jetzt möchte ich, um zu überprüfen, dass die LogTrace wird aufgerufen und der string zu Protokoll enthält einige id. Das problem ist, dass es sein kann, unterschiedlich bezeichnet. E. g.
1) LogTrace("MyString" + id)
2) LogTrace("MyString {0}", id)
und so weiter.
Ist es ein guter Weg, mit Moq, um zu überprüfen, alle Szenarien? Ich kann nur denken, der Schaffung eines hand-made-mock, das format der Zeichenfolge, die verfügbar sein wird für die überprüfung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
params object[]
an die Methode übergeben wird alsobject[]
sowieso so, du musst nur entsprechend das array irgendwie (wie oben für Beispiel, dieses übernimmt alles).Wenn Sie mehr Kontrolle über die Liste, verwenden Sie die
It.Is
matcher, die es Ihnen ermöglicht Ihre eigenen Prädikat:Dieses Beispiel zeigt, wie um zu überprüfen, ob die param-Liste ist nicht leer und enthält
5
als einziger parameter vom Typint
.Ich glaube nicht, dass es einen einfachen Weg gibt, zu tun, was Sie hier benötigen. Das problem ist, dass Sie brauchen, um sicherzustellen, dass eine bestimmte Kombination von Werten übergeben werden, um Ihre Methode, Ergebnisse, die in vielen verschiedenen nachprüfbare Szenarien:
ID UND Parameter enthält keine ID - pass
ID UND Parameter enthält-ID = pass
Parameter enthält keine ID - fail
Jedoch Moq bietet keine Unterstützung für diese Art der bedingten Ausdrücke zwischen verschiedenen Argumente, die von Ihrer nachprüfbaren Methode. Eine mögliche Lösung ist zu prüfen, für die Abwesenheit einer id, statt dessen Präsenz in entweder-argument. Probieren Sie etwas wie:
Was wir hier tun, ist zu prüfen, ob die scheitern Bedingung ist immer erfüllt - das heißt, Ihre Zeichenfolge nicht enthalten eine id, und auch nicht Ihre Objekt-array. Wir verwenden Mal.Nie (), um sicherzustellen, dass diese situation sollte nie eintreten.
Halten Sie im Verstand, jedoch, dass der code möglicherweise nicht auf den ersten Blick klar; stellen Sie sicher, dass Sie richtig erklären Ihre Absicht, sobald Sie es schreiben.
Könnten Sie versuchen, verwenden Sie die
Callback
, aber es wird dann ziemlich verworren (nicht getestet):Wenn
ILogger
hat eine kleine Oberfläche, sollten Sie erwägen, die Implementierung eines stub-manuell (die würde verhindern, dass alle Zeilen, die soll es ja melden), und stellen Sie sicher, dass am Ende des Tests. Wenn Sie mehrere Zeilen protokolliert wird, als dies ein lesenswerter setup.