Ich verwende Moq, um zu überprüfen, ob eine Methode in meinem Unittest aufgerufen wird. In diesem speziellen Fall möchte ich testen, ob die zu testende Methode einen Fehler über log4net protokolliert. Das Problem besteht darin, dass dies entweder durch Aufruf von log.Error
oder log.ErrorFormat
geschehen kann. Beides ist in Ordnung.
Wie kann ich das überprüfen? Ich kann nur bestätigen, dass beide aufgerufen wurden.
%Vor%Nun, da ich darüber nachdenke, haben sie beide eine Reihe von Überlastungen. Es macht mir nichts aus, wenn eine der Überladungen auch genannt wird (ich beginne zu bezweifeln, dass das ein guter Test ist).
Vielen Dank im Voraus.
EDIT: Ich habe gerade an etwas Fieses gedacht:
%Vor% Vielleicht kann ich das in eine Art von Erweiterungsmethode einbetten ... z. VerifyAny
.
Sie können einen Rückruf für jede gültige Fehlermethode registrieren, die ein Flag setzt:
%Vor%Natürlich ist das immer noch mühsam, wenn Sie viele Überladungen abdecken müssen.
BEARBEITEN : Und zum Spaß, hier ist eine Erweiterungsmethode für Mock<T>.VerifyAny
:
Verwendung:
%Vor% Wenn Sie speziell testen, dass ein bestimmter Fehler protokolliert wurde, warum nicht zwei Tests haben, einen, der sicherstellt, dass log.Error
aufgerufen wird, und einen, der sicherstellt, dass log.ErrorFormat
aufgerufen wird, gehe ich davon aus, dass Sie diesen kontrollieren können wird basierend auf der Eingabe aufgerufen.
Wenn Sie das eine oder andere noch überprüfen wollen, können Sie einfach diesen Ansatz verwenden, es macht genau das, was Sie brauchen:
Verify dass entweder die eine oder die andere Methode in einem Komponententest aufgerufen wurde
Tags und Links c# unit-testing moq