c# - 测试工厂模式

标签 c# .net unit-testing moq

我有下面的小样本工厂模式实现,想知道是否有人可以帮助我编写正确的 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。这允许您拥有一个不可变的对象,从而减少应用程序的状态。

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

相关文章:

.net - 将 2 个不同类型的 IEnumerables 与通用接口(interface)组合在一起

c# - .net 中的单元和集成测试组织

c# - 无法在 C# 中解析 JSON 响应

c# - 我如何从字符串创建动态 lambda 表达式?

.net - 保护.NET框架

c# - .NET 的 64 位系统上的原子读/写大小?

python - 单元测试 : How to assert multiple calls of same method?

java - JUNIT : run setup only once for a large number of test classes

c# - 将值从一种形式传递给C#中的另一种形式

javascript - 在asp.net c#中通过POST传递动态列表