Ich habe die folgende Methode:
public CustomObect MyMethod()
{
var lUser = GetCurrentUser();
if (lUser.HaveAccess)
{
//One behavior
}
else
{
//Other behavior
}
//return CustomObject
}
Ich möchte verspotten IMyInterface.GetCurrentUser
, damit MyMethod
ich beim Aufrufen zu einem der Codepfade gelangen kann, um ihn zu überprüfen. Wie macht man das mit Moq?
Ich mache folgendes:
var moq = new Mock<IMyInterface>();
moq.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);
//act
var lResult = moq.Object.MyMethod();
Aber aus irgendeinem Grund lResult
ist es immer so null
und wenn ich versuche, mich MyMethod
auf das Debuggen einzulassen, springe ich immer zur nächsten Anweisung.
lUnauthorizedUser
initialisiert? Ich würde mir vorstellen, dass Sie so etwas wollen würdenmoq.Setup(x => x.GetCurrentUser()).Returns(new User() { HaveAccess = false });
m setting it in the above code, just didn
eingefügt, um den Code kurz zu halten.Antworten:
Dies wird als Teil-Mock bezeichnet, und wie ich es in moq kenne, muss die Klasse und nicht die Schnittstelle verspottet und dann die Eigenschaft "Callbase" für Ihr verspottetes Objekt auf "true" gesetzt werden.
Dazu müssen alle Methoden und Eigenschaften der Klasse, die Sie testen, virtuell gemacht werden. Angenommen, dies ist kein Problem, können Sie einen Test wie folgt schreiben:
quelle
t think it
so einfach.CallBase
den wahren, sehr wesentlichen Teil einzustellen, danke!Die Antwort von Lee erweitern ,
Sie müssen nicht alle Methoden und Eigenschaften Ihrer Klasse virtuell machen, sondern nur die, die Sie verspotten möchten.
Es sollte auch beachtet werden, dass Sie sich über die konkrete Implementierung Ihrer Klasse lustig machen sollten.
var mock = new Mock<YourTestClass>(); // vs. var mock = new Mock<IYourTestInterface>();
Wenn Ihre Klasse keinen Standardkonstruktor hat, müssen Sie auch Argumente angeben, die an sie übergeben werden sollen über:
Wo
x, y, z
sind die ersten, zweiten und dritten Parameter für Ihren Konstruktor?Und schließlich müssen Sie einschließen, wenn die Methode, die Sie verspotten möchten, geschützt ist
Moq.Protected
quelle
nameof(YourTestClass.YourMockMethodName)
anstelle von "YourMockMethodName" verwenden können. Aus diesem Grund funktioniert der Test des Methodennamens beim Refactor weiterhin.Ich hatte einen ähnlichen Fall. Ich fand, dass der folgende Code mir mehr Flexibilität gab, sowohl verspottete als auch tatsächliche Methoden aus einer bestimmten Implementierung einer Schnittstelle zu verwenden:
Jetzt können Sie die eigentliche Methode verwenden, aber auch Dinge wie
Verify
sehen, wie oft sie aufgerufen wurde.quelle