Wie auf null zurück, wenn der Zugriff auf eine moq Objekt?
Ich bin mit Moq Bibliothek für unit-Tests. Was ich jetzt möchte ist, dass wenn ich auf mein Objekt für die erste Zeit sollte es null zurückgeben, und wenn ich Zugang zu diesen auf zweiten mal sollte es wieder etwas anderes.
hier ist mein code
var mock = new Mock<IMyClass>();
mock.Setup(?????);
mock.Setup(?????);
var actual = target.Method(mock.object);
in meiner Methode bin ich zuerst zu überprüfen, ob das mock-Objekt null ist oder nicht, wenn es null ist, dann tun Sie es initialisieren und dann tun einige Anrufe drauf.
bool Method(IMyClass myObj)
{
if (myObj != null)
return true;
else
{
myObj = new MyClass();
bool result = myObj.SomeFunctionReturningBool();
return result;
}
}
was zu tun ist setup für mock-Objekt,
Außerdem muss ich wissen, wie zum Hohn dieser Zeile
bool result = myObj.SomeFunctionReturningBool();
- dies ist nicht im Zusammenhang mit mocking, rufen Sie einfach die Methode in Ihrer Klasse übergeben von null realisieren, unit-test
- Ich weiß nicht Recht bekommen es. Die Idee, mock ist nicht null als IMayClass. Wenn Sie möchten, dass null dann einfach aufrufen
target.Method(null)
. Zur zweiten Frage: man kann einfach nicht. Sie erstellen Sie eine Instanz von MyClass und dann invoke-Methode auf, so kann es sich nicht spotten. - Methode else-Bedingung wird nur ausgeführt, wenn myObj, null ist, und sonst habe ich um einen Anruf zu tätigen, um SomeFunctionReturningBool, und wenn Sie null senden, dann kann ich nicht verspotten diese Funktion,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie versuchen, um zwei tests mit einem test-Methode - vielleicht wäre es besser, teilen sich die tests in zwei?
Möchten Sie auch, dass zur Initialisierung eines neuen Objekts wird die Methode übergeben null. Um dies zu testen, schlage ich vor, erstellen ein factory-Objekt verantwortlich für die Erstellung von Instanzen von
MyClass
. Der neue code würde wie folgt Aussehen:Dann würden die tests Aussehen:
Hier die Fabrik-Muster wurde verwendet, um in ein Objekt, die Objekte erstellen, die von
IMyClass
geben, und dann die Fabrik selbst wurde verspottet.Wenn Sie nicht wollen, ändern Sie Ihre Methode, die Signatur zu erzeugen, dann die Fabrik im Konstruktor der Klasse, und machen es zugänglich über eine öffentliche Eigenschaft der Klasse. Es kann dann überschrieben werden, die Prüfung durch die mock-factory. Dies wird als dependency injection.
Zu verspotten Ergebnis Wert, den Sie tun können, ist einfach:
für die andere Frage haben, übergeben Sie den Wert null in der unit-test statt der übergabe
mock.object
und Ihre unit-test-Abdeckung zu. Also im Grunde erstellen Sie zwei unit-test mit:und der andere mit:
Derzeit Ihr SUT ist eng gekoppelt mit
MyClass
Umsetzung. Sie können keine mock-Objekte, die instanziiert sind mitnew
Schlüsselwort in Ihrem SUT. So können Sie nicht testen Sie Ihr SUT in isolation, und Ihr test nicht unit test mehr. Bei der Umsetzung vonMyClass.SomeFunctionReturningBool
ändern wird (es wird zurücktrue
stattfalse
), tests bereitgestellt wird scheitern. Dies sollte nicht passieren. So delegieren Sie die Erstellung, um einige Abhängigkeit (Fabrik) und injizieren, diese Abhängigkeit zu Ihr SUT:BTW Zuweisung einen neuen Wert Methode parameter hat keine Auswirkung auf die Referenz, die Sie an Methode übergeben.
Umsetzung:
Können Sie TestFixture mit parameter. dieser test wird zwei mal verschiedene type-Wert.
Moq - null Zurück - Dieses Beispiel soll zeigen, wie null zurück, mit Moq. Während Sie die Codezeile benötigt wird, ist die auskommentierte Zeile unten, eine voll funktionsfähige Beispiel.