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

C# 单元测试中的存根扩展方法,c#,unit-testing,C#,Unit Testing,我希望测试一个使用来自第三方依赖项的代码的方法。这个依赖项定义和接口-IPublishedContent-传递一个参数给我想要测试的方法 在我的方法中,我正在调用一个名为GetPropertyValue的IPPublishedContent方法。但是,该方法不是直接在接口上定义的,而是由第三方依赖项提供的扩展方法添加的 考虑到这一点,我像往常一样模拟扩展方法 相反,我想我应该创建一个实现IPPublishedContent的存根类,并在测试中传递该类的一个实例作为参数。我将要测试的方法添加为存根

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

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

考虑到这一点,我像往常一样模拟扩展方法

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

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

但显然不是在我的测试中——如果我在存根中的实例方法上放了一个断点,它就永远不会被调用,并且测试失败,因为它仍然在调用第三方扩展方法


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

存根不能替代静态或扩展方法。你需要使用垫片。
请参见

方法是否完全相同包括所有参数类型和返回值类型?第三方库不知道您添加的实例方法。这不是一个可以在自己的类中重写的虚拟方法。@Aik-是的,它们是。@Rawling-这是真的,也许我只是在期待一些不会发生的事情;但我并没有覆盖它(我正在实现一个接口,而不是对基类进行子分类)。在我看来,在运行时,我的测试将有一个stubbed类的实例,它有一个具有匹配签名的实例方法,因此应该优先调用第三方库中的扩展方法。为了实现所需的行为,必须使用虚拟函数。遗憾的是,扩展方法调用是静态调用,一旦编译,就无法替换它