【问题标题】:Testing Factory Pattern测试工厂模式
【发布时间】:2013-04-02 18:23:53
【问题描述】:

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

【问题讨论】:

    标签: c# .net unit-testing moq


    【解决方案1】:

    你不会嘲笑TestClass,因为那是你正在测试的。

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

    public IService Service { get; private set; }
    

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

    对于 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));
    }
    

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

    【讨论】:

    • 我想,我并不清楚我的问题。假设我有一个构造函数,我在其中发送 Iservice(我可以在测试时将它用于 Mock(Iservice))。我的主要问题是热我可以测试初始化​​构造函数的方法(字符串)吗?我发送的模拟服务将被 TestMethod 覆盖。
    • @user2237300 我不确定你在说什么。您能否更新您的问题以使其更清楚?
    • @Aravind 我更新了我的答案,让我知道它是否更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多