Ich bin ziemlich neu in Unit-Tests in C # und lerne, Moq zu verwenden. Unten ist die Klasse, die ich zu testen versuche.
class MyClass
{
SomeClass someClass;
public MyClass(SomeClass someClass)
{
this.someClass = someClass;
}
public void MyMethod(string method)
{
method = "test"
someClass.DoSomething(method);
}
}
class Someclass
{
public DoSomething(string method)
{
// do something...
}
}
Unten ist meine Testklasse:
class MyClassTest
{
[TestMethod()]
public void MyMethodTest()
{
string action="test";
Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
mockSomeClass.SetUp(a => a.DoSomething(action));
MyClass myClass = new MyClass(mockSomeClass.Object);
myClass.MyMethod(action);
mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
}
}
Ich bekomme folgende Ausnahme:
Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..
Ich möchte nur überprüfen, ob die Methode "MyMethod" aufgerufen wird oder nicht. Vermisse ich etwas
SomeClass
es keine Definition für gibtMyMethod(string)
, für die es anscheinend nicht so ist.Antworten:
Sie überprüfen die falsche Methode. Moq erfordert, dass Sie die Methode in der Abhängigkeitsklasse einrichten (und dann optional überprüfen).
Sie sollten etwas Ähnliches tun:
Mit anderen Worten, Sie überprüfen, dass
MyClass#MyMethod
Ihre KlasseSomeClass#DoSomething
in diesem Prozess definitiv einmal anruft . Beachten Sie, dass Sie dasTimes
Argument nicht benötigen . Ich habe nur seinen Wert demonstriert.quelle
mockSomeClass.VerifyAll();
das gleiche Ergebnis erzielen und trockener sein?Mock
Vergleich zuNSubstitute
ist, dass, wenn Sie versuchen, auch die Parameter zu überprüfen und die Überprüfung fehlschlägt, nur angezeigt wird, welche Aufrufe ausgeführt wurden, aber nicht, was genau erwartet wurde, wenn Sie Variablen im Überprüfungsausdruck verwendet haben - es wird nur Variable angezeigt Name, nicht sein Wert, daher müssen Sie debuggen, um zu überprüfen, welchen Wert genau diese Variable hat. NSubstitute zeigt nur Werte von beiden und sogar dort, wo es anders war.