Io attualmente eseguire test che assomigliano a quanto segue:Come utilizzare moq per testare codice che chiama aiutanti protetti
// 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());
}
}
È possibile che questo guarda bene per le cose semplici, ma la classe stub ottiene esponenzialmente più grande e più complessa rapidamente . Mi piacerebbe sostituire la classe stub usando Moq. Tuttavia questo non verrà compilato perché per qualche motivo non posso impostare un valore di ritorno su un metodo protetto.
[TestMethod]
public void ClassUnderTest_MethodUnderTest_TestHelperReturnsFalse()
{
var mockClass = new Mock<ClassUnderTest>();
mockClass.Protected().Setup("HelperMethod").Returns(false);
Assert.IsFalse(mockClass.Object.MethodUnderTest());
}
Qualcuno sa come andrei a fare questo? Posso farlo con moq?
Qualcosa non sembra proprio qui ... non prendi in giro il tuo SUT, prendi in giro le sue dipendenze. –
Sì, in realtà Yojin prende in giro il SUT per sostituire una parte del SUT che dovrebbe essere tenuta separata, non in un metodo di supporto protetto. – Matthias