gpt4 book ai didi

c# - 测试工厂模式

转载 作者:行者123 更新时间:2023-12-02 22:08:19 26 4
gpt4 key购买 nike

我有下面的小型示例工厂模式实现,想知道是否有人可以帮助我编写适当的 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");
}

最佳答案

您不会模拟 TestClass,因为那是您正在测试的内容。

为此,您需要为 service 创建一个只读属性。

public IService Service { get; private set; }

您需要测试构造函数和Method 修改TestClass 实例状态(在本例中为Service)的方式。

测试 B 测试用例的 Method 测试看起来像下面这样:

[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));
}

我建议仅使用构造函数方法来注入(inject)您的 IService。这允许您拥有一个不可变对象(immutable对象),该对象将减少应用程序的状态。

关于c# - 测试工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15771495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com