我在下面有一个小样本工厂模式实现,并且想知道是否有人可以帮助我编写正确的Moq单元测试用例,以获得最大的代码覆盖率:
public class TestClass
{
private readonly IService service;
public TestClass(Iservice service)
{
this.service = service;
}
public void Method(string test)
{
service = TestMethod(test);
service.somemethod();
}
private IService TestMethod(string test)
{
if(test == 'A')
service = new A();
if(test == 'B')
service = new B();
return service;
}
}
我正在寻找测试TestClass的一些帮助,更重要的是我发送Mock时的TestMethod,例如我的测试方法如下:
[TestMethod]
public void TestCaseA()
{
Mock<IService> serviceMock = new Mock<Iservice>(MockBehaviour.strict);
TestClass tClass = new TestClass(serviceMock.Object);
// The Question is, what is best approach to test this scenario ?
// If i go with below approach, new A() will override serviceMock
// which i am passing through constructor.
var target = tClass.Method("A");
}
答案 0 :(得分:5)
你不会嘲笑TestClass
,因为那是你正在测试的。
为此,您需要为service
创建一个只读属性。
public IService Service { get; private set; }
您需要测试构造函数和Method
修改Service
实例的状态(在本例中为TestClass
)的方式。
对于Method
测试用例的B
测试,您的测试类似于以下内容:
[TestMethod]
public void TestSomeMethod()
{
// Arrange/Act
var target = new TestClass((new Mock<IService>()).Object);
target.Method("B");
// Assert
Assert.IsInstanceOfType(target.Service, typeof(B));
}
对于A
测试用例的测试构造函数,您的测试看起来类似于以下内容:
[TestMethod()]
public void TestCasesA()
{
// Arrange/Act
var target = new TestClass("A");
// Assert
Assert.IsInstanceOfType(target.service, typeof(A));
}
我建议只使用构造函数方法注入IService
。这允许您拥有一个不可变对象,这将减少您的应用程序的状态。