单元测试嵌套方法
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 可以构建一个也适合你)。
假设我有这样的服务:
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 可以构建一个也适合你)。