如何在单元测试期间覆盖 IQueryable 的 Contains 方法?
Posted
技术标签:
【中文标题】如何在单元测试期间覆盖 IQueryable 的 Contains 方法?【英文标题】:How do I override the Contains method of IQueryable during a unit test? 【发布时间】:2011-02-17 04:33:40 【问题描述】:事情是这样的:我正在测试一个使用 LINQ to Entities (EF4/.NET4) 的应用程序。该应用程序绑定到忽略空值的 Contains 方法的实现,并且由于数据库的配置方式,忽略大小写。效果很好。
但是,当我从单元测试中调用相同的方法时,我传入了一个假上下文,该上下文公开了具有 IQueryable 的内存实现的集合。在这种情况下,引入的是 Contains 的 LINQ to Objects 版本,它关心 null 和大小写。
现在,我可以编写我的应用程序代码来检查 null 和大小写,但我不想影响正在生成的 SQL,以便在从单元测试调用它并且不涉及 SQL 时它可以工作。
我真正想要的是提供正确的 IQueryable 或其他任何东西,以便在测试期间,我可以换入我自己的忽略 null 和大小写的自定义 Contains 实现。我怎么做?谢谢!
【问题讨论】:
【参考方案1】:编译器将绑定到最派生的编译时类型的扩展方法。
即使您传递了一个模拟实例并在您的单元测试上下文中为其类型提供了“包含”扩展方法的自定义实现,您调用的一些代码只知道您提供了一个 IQueriable 实例,因此它绑定到 linq到对象版本。
也许你可以通过implementing your own QueryProvider 实现这一点,但这似乎是一个极端的选择。
如果可以使用 C#4.0 动态类型,也许还有另一种方法。
【讨论】:
【参考方案2】:如果你有一个虚假的上下文,你不能创建一个模拟 IQueriable
并使用它吗?
【讨论】:
我可以。如何让它绑定到我的自定义 Contains 方法?这就是我卡住的地方。 你是如何将你的模拟传递给函数的? 这只是一个假的,是的,我是。正在调用 Contains 的 LINQ to Objects 绑定。我希望调用我自己的 Contains 自定义实现。以上是关于如何在单元测试期间覆盖 IQueryable 的 Contains 方法?的主要内容,如果未能解决你的问题,请参考以下文章
在测试期间,如何覆盖 urlconf 中使用的 Django 设置?