Wie zu verwenden moq, um test-code, der fordert, geschützt Helfer
Ich derzeit laufen tests, die wie folgt Aussehen:
//In Blah.cs
public class ClassUnderTest
{
public bool MethodUnderTest()
{
//Do a bunch of stuff...
return HelperMethod();
}
protected virtual bool HelperMethod()
{
bool success = false;
//Proprietary Hardware Access.
//Database Calls.
//File System Modifications.
return success;
}
}
//In TestBlah.cs
public class TestStub : ClassUnderTest
{
public bool HelperMethodReturnValue;
protected override bool HelperMethod()
{
return HelperMethodReturnValue;
}
}
[TestClass]
public class TestingClass
{
[TestMethod]
public void ClassUnderTest_MethodUnderTest_TestHelperReturnsTrue()
{
var stub = new TestStub();
stub.HelperMethodReturnValue = true;
Assert.IsTrue(stub.MethodUnderTest());
}
[TestMethod]
public void ClassUnderTest_MethodUnderTest_TestHelperReturnsFalse()
{
var stub = new TestStub();
stub.HelperMethodReturnValue = false;
Assert.IsFalse(stub.MethodUnderTest());
}
}
Den oben genannten sieht gut für einfache Sachen, allerdings die stub-Klasse wird exponentiell größer und komplexer schnell.
Ich würde gerne ersetzen die stub-Klasse mit Moq. Aber dieser Code wird nicht kompiliert, da aus irgendeinem Grund kann ich nicht den return Wert auf eine protected-Methode.
[TestMethod]
public void ClassUnderTest_MethodUnderTest_TestHelperReturnsFalse()
{
var mockClass = new Mock<ClassUnderTest>();
mockClass.Protected().Setup("HelperMethod").Returns(false);
Assert.IsFalse(mockClass.Object.MethodUnderTest());
}
Jemand weiß, wie ich gehen würde, über das tun dies? Kann ich dies mit moq?
- Etwas scheint nicht hier... Sie verspotten Sie nicht Ihr LET, Sie zu verspotten, Ihre Abhängigkeiten.
- Ja, eigentlich Yojin spottet der SUT ersetzen einen Teil des SUT, die getrennt werden sollten, nicht in einem geschützten Helfer-Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf die moq-source-code ich würde denke müssen Sie explizit aufrufen, die generische version von Setup. Die nicht-generische version zu sein scheint, verwendet für void-Methoden. So versuchen
Neben dieser, würde ich empfehlen neu zu denken, Ihre Klasse design. Wenn HelperMethod() ist dabei so einen Haufen Dinge, die es Wert wäre, seine eigene Klasse eingespritzt wird, als eine Abhängigkeit in ClassUnderTest. Tests ein mock-Objekt, anstatt ein mock-Objekt zu testen, etwas "real" ist nicht das, was mocking frameworks vorgenommen werden (nicht in den ersten Platz, mindestens).
Protected-Methoden sind nicht ein guter Weg zu isolieren, Abhängigkeiten, aber es tut manchmal kommen, besonders wenn die Anpassung der legacy-code für Testbarkeit. Eine option, die vermeidet die umständliche string-basierte Moq syntax ist, um die Methode "protected internal" (oder nur "intern", wenn Sie nicht wollen, um es zu überschreiben bei normaler Nutzung aus anderen Baugruppen.) Sie verwenden dann InternalsVisibleTo auf der Versammlung zu stellen die Methode. Das ist ein bisschen ein hack, aber über eine protected-Methode für diesen Zweck ist schon ein bisschen ein hack. In gewisser Weise bevorzuge ich die "internen" - Ansatz, da macht es auch klar, dass dies eine Hintertür Methode, die man nicht verwenden sollte (außer für Tests), die im Gegensatz zu einer protected-Methode, die Sie erwarten, zu überschreiben, bei normaler Nutzung.