单元测试中的Stubbing和extension方法

时间:2014-03-10 08:26:13

标签: c# unit-testing

我正在尝试测试使用来自第三方依赖项的代码的方法。这个依赖项定义和接口--IPublishedContent - 将参数传递给我想要测试的方法。

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

鉴于此,我can't use Moq通常会模拟扩展方法。

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

现在,我的理解是,如果我有一个实例方法和一个具有相同签名的扩展方法,那就是instance method that gets called

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

任何人都可以解释为什么会这样吗?我知道,虽然没有使用,但微软Fakes(使用垫片)可能是解决这个问题的方法。但我不明白为什么这种存根方法不起作用。感谢。

1 个答案:

答案 0 :(得分:2)

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