说我有这样的服务:
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
?或者这是一个糟糕的模式?这样做的正确方法是什么?
答案 0 :(得分:2)
对于另一个课程,你会使用moq,如写的那样。
但是,该类正在测试中,我认为您不应该在测试中分离出这两种方法,原因与您不测试私有方法类似。当它归结为代码被重构时,如果测试失败,则不会调用第二个方法。不,公共API不受影响。
最好在调用DoOtherStuff时对断言应该发生什么进行断言,正如你现在所做的那样。
答案 1 :(得分:2)
只要满足合同,您就不应该关心单元测试如何实现特定的公共功能。
注意:上面使用的“public”一般意义上是“外部可用”,通常它与C#public
对齐,但有时您希望/必须将其他方法标记为公共,即使它实际上不是外部的一部分合同。
如果您真的必须测试DoOtherStuff
被调用,您可以使用该方法virtual
并使用提供自己版本的测试实现,以某种方式通知您有关该调用(可能Moq可以为您构建一个太)。