单元测试中的存根和扩展方法

本文关键字:扩展 方法 存根 单元测试 | 更新日期: 2023-09-27 17:49:18

我想测试一个使用第三方依赖代码的方法。这个依赖定义了一个接口- IPublishedContent -它传递了一个参数给我想要测试的方法。

在我的方法中,我在IPublishedContent上调用了一个名为GetPropertyValue的方法。然而,这个方法不是直接在接口上定义的,它是通过第三方依赖项提供的扩展方法添加的。

鉴于此,我不能使用Moq,因为我通常会模拟扩展方法。

相反,我认为我应该创建一个实现ipublishhedcontent的存根类,并将其实例作为我测试中的参数传递。我在存根上添加了我想要测试的方法,作为实例方法

现在,我的理解是,如果我有一个实例方法和一个扩展方法具有相同的签名,它是实例方法被调用。

但显然不是在我的测试中-如果我在我的存根中设置了实例方法的断点,它永远不会被调用,并且测试失败并出现错误,因为它仍然调用第三方扩展方法。

谁能解释一下为什么会这样?我意识到,虽然没有使用,微软假货(使用垫片)可能是解决这个问题的方法。但我不明白为什么这种存根方法不起作用。谢谢。

单元测试中的存根和扩展方法

存根不能替代静态方法或扩展方法。你需要用垫片。见https://stacktoheap.com/blog/2012/11/11/testing-extension-methods-with-microsoft-fakes/