C#单元测试-检查是否达到了私有方法

C#单元测试-检查是否达到了私有方法,c#,moq,C#,Moq,我正在使用C#MOQ库 假设我想为这段代码创建一个UnitTest: if(condition){ privateMethod(); } else{ logger.info("didn't hit") } 我想检查是否命中了privateMethod,我无法使用Verify函数,因为它是私有的。我该怎么做 我考虑添加一个专门用于单元测试的Status成员,它将保留退出测试方法之前的最后一个位置。不要测试私有方法。它们是类的私有实现细节。您应该只测试执行公共方法的结果 正确设计的

我正在使用C#MOQ库

假设我想为这段代码创建一个
UnitTest

if(condition){
    privateMethod();
}
else{
    logger.info("didn't hit")
}
我想检查是否命中了
privateMethod
,我无法使用
Verify
函数,因为它是私有的。我该怎么做


我考虑添加一个专门用于单元测试的
Status
成员,它将保留退出测试方法之前的最后一个位置。

不要测试私有方法。它们是类的私有实现细节。您应该只测试执行公共方法的结果

正确设计的可靠代码永远不会让您处于需要进行私人模拟的位置

根据是否要更改设计,您可以采取以下几种方法:

  • 不要试图模仿私人细节,关注公共API(对设计问题没有帮助)
  • 将私有方法提取到类中,引入依赖关系(长期解决方案,改进设计并使代码易于测试)
  • 使私有方法受到保护,在测试中重写(对设计问题没有帮助,可能不会产生有价值的测试)

无论你选哪个,我都由你决定。然而,我将再次强调它——模仿私有方法不是单元测试、库或工具问题——它是一个设计问题,并且是最好的解决方案

我使用MSTest,这是我在测试类中调用私有方法时使用的解决方案:

Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);

它使用类

这个
私有方法
的访问权是否最终会更改为
受保护的
?如果你想测试方法调用,你必须将你的私有方法提取到一个新类中并模拟它。否则,您应该关注私有方法的效果。示例:如果您的方法将一些数据写入文件,您可以检查该文件是否正确created@Grappachu但是,如果这些方法将一些数据写入一个文件,我们已经离开单元测试并进行集成测试,而类本身对单元无效test@SirRufo你说得对,我没有选择一个最好的例子。虽然你写的关于私有方法单元测试的东西是正确的,但它并没有回答OP的问题。因为OP想知道一种方法,从他正在测试的公共方法中找出是否调用了他的私有方法。这个类是一个
管理器
,这个方法是他的起点。因此,它有一些不能被模拟的私有逻辑。因此,我想在这里测试的是,例如:确保经理启动了适当数量的员工,等等。也许现在不适合对这种方法进行单元测试?我为您提供了3种替代方法。我的建议是注入另一个单元作为完成所有这些事情的依赖项,或者甚至使方法受到保护并覆盖它。这个问题不是关于如何调用私有方法,而是如何检测是否调用了私有方法