Tôi hiện chạy thử nghiệm mà trông giống như sau:Làm thế nào để sử dụng moq để kiểm tra mã gọi người giúp đỡ bảo vệ
// 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());
}
}
Trên đây có vẻ tốt đẹp cho mọi thứ đơn giản, tuy nhiên lớp còn sơ khai được theo cấp số nhân lớn hơn và phức tạp hơn một cách nhanh chóng . Tôi muốn thay thế lớp sơ khai bằng cách sử dụng Moq. Tuy nhiên điều này sẽ không biên dịch vì vì một lý do nào đó tôi không thể đặt giá trị trả về trên một phương thức được bảo vệ.
[TestMethod]
public void ClassUnderTest_MethodUnderTest_TestHelperReturnsFalse()
{
var mockClass = new Mock<ClassUnderTest>();
mockClass.Protected().Setup("HelperMethod").Returns(false);
Assert.IsFalse(mockClass.Object.MethodUnderTest());
}
Bất kỳ ai biết tôi sẽ làm thế nào? Tôi có thể làm điều này với moq không?
Có gì đó không có vẻ ở đây ... bạn không chế nhạo SUT của bạn, bạn giả lập phụ thuộc của nó. –
Vâng, thực tế Yojin chế nhạo SUT để thay thế một phần của SUT nên được giữ riêng biệt, không phải trong một phương thức trợ giúp được bảo vệ. – Matthias