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