如何在单元测试期间覆盖IQueryable的Contains方法?

时间:2010-05-08 15:46:34

标签: c# linq unit-testing extension-methods iqueryable

所以这就是事情:我有一个我正在测试的应用程序使用LINQ to Entities(EF4 / .NET4)。该应用程序绑定到忽略空值的Contains方法的实现,并且由于数据库的配置方式,忽略大小写。这很有效。

但是,当我从单元测试中调用相同的方法时,我传入的是一个伪上下文,它使用IQueryable的内存实现来公开集合。在这种情况下,它是引入的包含的LINQ to Objects版本,并且关注null和case。

现在,我可以编写我的应用程序代码来检查null和case,但我不想影响正在生成的SQL,因此当它从单元测试中调用并且不涉及SQL时它将起作用。

我真正想要的是提供正确的IQueryable或其他任何东西,以便在测试期间,我可以交换我自己的自定义包含忽略null和case的实现。我怎么做?谢谢!

2 个答案:

答案 0 :(得分:1)

编译器将绑定到最派生的编译时类型的扩展方法。

即使您传递了一个模拟实例并且在单元测试上下文中将一个“包含”扩展方法的自定义实现添加到其类型,您调用的一些代码只知道您提供了一个IQueriable实例,因此它绑定到linq对象版本。

可能你可以通过implementing your own QueryProvider实现这一目标,但这似乎是一个极端的选择。

如果您可以使用C#4.0动态类型,可能还有另一种方法。

答案 1 :(得分:0)

如果你有假的上下文,你不能创建一个模拟IQueriable并使用它吗?