单元测试嵌套方法

Unit testing a nested method

假设我有这样的服务:

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?或者这是一个糟糕的模式?执行此操作的正确方法是什么?

对于另一个 class,您将使用所写的最小起订量。

但是,class 正在测试中,我认为您不应该在测试中将这两种方法分开,原因与您不测试私有方法的原因类似。归根结底,如果代码被重构,那么如果测试失败,你的第二个方法就不会被调用。不,public API 不受影响。

最好断言在调用 DoOtherStuff 时依赖项应该发生什么,就像您现在所做的那样。

您不应该关心单元测试如何实现特定的 public 功能,只要它满足其约定即可。

注意:上面的"public"在一般意义上使用"externally usable",通常它与C#对齐public,但有时你want/have将额外的方法标记为public 即使它真的不是外部合同的一部分。

如果您真的必须测试 DoOtherStuff 是否被调用,您可以制作该方法 virtual 并使用提供自己版本的测试实现,以某种方式通知您有关调用的信息(可能 Moq 可以构建一个也适合你)。