C# 单元测试 - 检查是否达到私有方法
C# Unit testing - check if a private method was reached
我正在使用 C# MOQ 库。
假设我想为这段代码创建一个 UnitTest
:
if(condition){
privateMethod();
}
else{
logger.info("didn't hit")
}
我想检查 privateMethod
是否被击中,我不能使用 Verify
函数,因为它是私有的。我该怎么做?
我考虑过添加一个 Status
成员专用于单元测试,它将在退出测试方法之前保存最后一个位置。
不要测试私有方法。它们是 class 的私有实现细节。您应该只测试执行 public 方法的结果。
Properly designed SOLID code will never put you in a position which will require you to do private mocking.
根据您是否要更改设计,您可以采取以下几种方法:
- 不要试图模拟私人细节,专注于 public API(对设计问题没有帮助)
- 将私有方法提取到 class,引入依赖关系(长期解决方案,改进设计并使代码易于测试)
- 保护私有方法,在测试中覆盖(对设计问题没有帮助,可能不会产生有价值的测试)
无论你选择什么,我都会留给你。但是,我会再强调一次 - 模拟私有方法 不是单元测试、库或工具问题 - 它是一个 设计问题 并且这样最好解决。
我使用 MSTest,这是我在测试 Class 中用来调用私有方法的解决方案:
Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);
它使用 PrivateObject Class
我正在使用 C# MOQ 库。
假设我想为这段代码创建一个 UnitTest
:
if(condition){
privateMethod();
}
else{
logger.info("didn't hit")
}
我想检查 privateMethod
是否被击中,我不能使用 Verify
函数,因为它是私有的。我该怎么做?
我考虑过添加一个 Status
成员专用于单元测试,它将在退出测试方法之前保存最后一个位置。
不要测试私有方法。它们是 class 的私有实现细节。您应该只测试执行 public 方法的结果。
Properly designed SOLID code will never put you in a position which will require you to do private mocking.
根据您是否要更改设计,您可以采取以下几种方法:
- 不要试图模拟私人细节,专注于 public API(对设计问题没有帮助)
- 将私有方法提取到 class,引入依赖关系(长期解决方案,改进设计并使代码易于测试)
- 保护私有方法,在测试中覆盖(对设计问题没有帮助,可能不会产生有价值的测试)
无论你选择什么,我都会留给你。但是,我会再强调一次 - 模拟私有方法 不是单元测试、库或工具问题 - 它是一个 设计问题 并且这样最好解决。
我使用 MSTest,这是我在测试 Class 中用来调用私有方法的解决方案:
Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);
它使用 PrivateObject Class