单元测试嵌套方法

时间:2015-04-22 20:38:30

标签: c# unit-testing mocking moq

说我有这样的服务:

public class MyService : IMyService
{
    public void DoStuff(IDependency dependency, string value)
    {
        dependency.SomeMethod(value, true);
        DoOtherStuff(dependency);
    }

    public void DoOtherStuff(IDependency dependency)
    {
        // do some stuff
    }
}

现在,在单元测试MyService时,我可以轻松地模拟依赖项并测试依赖项是否正确使用:

public void MyServiceTest()
{
    // Arrange 
    var mockDependency = new Mock<IDependency>();
    mockDependency.Setup(m => m.SomeMethod());
    var service = new MyService();

    // Act
    service.DoStuff(mockDependency.Object, "value");

    // Assert
    mockDependency.Verify(v => v.SomeMethod(), Times.Once);
}

如何测试服务调用DoOtherStuff?或者这是一个糟糕的模式?这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

对于另一个课程,你会使用moq,如写的那样。

但是,该类正在测试中,我认为您不应该在测试中分离出这两种方法,原因与您不测试私有方法类似。当它归结为代码被重构时,如果测试失败,则不会调用第二个方法。不,公共API不受影响。

最好在调用DoOtherStuff时对断言应该发生什么进行断言,正如你现在所做的那样。

答案 1 :(得分:2)

只要满足合同,您就不应该关心单元测试如何实现特定的公共功能。

注意:上面使用的“public”一般意义上是“外部可用”,通常它与C#public对齐,但有时您希望/必须将其他方法标记为公共,即使它实际上不是外部的一部分合同。

如果您真的必须测试DoOtherStuff被调用,您可以使用该方法virtual并使用提供自己版本的测试实现,以某种方式通知您有关该调用(可能Moq可以为您构建一个太)。