首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟或以类似方式注入应用于NHibernate会话的查询扩展方法的替代方法

如何模拟或以类似方式注入应用于NHibernate会话的查询扩展方法的替代方法
EN

Stack Overflow用户
提问于 2010-11-18 05:22:15
回答 1查看 986关注 0票数 3

我正在尝试模拟或类似于应用于nhibernate-3会话的查询扩展方法。类似于下面的内容...

代码语言:javascript
复制
public IQueryable<Entity> GetEntities
{
  return entities = Session.Query<Entity>();
}

其中,查询扩展方法返回一个IQueryable集合。

我可以通过使用Moq或Rhinos清楚地模拟出Session对象。但到目前为止还没有找到一种合适的方法来伪装或取代扩展方法。事实上,阅读几个关于堆栈溢出的问题的答案,这可能是不可能的。

参阅questions How to mock extension methods with Rhino Mock? Mocking Extension Methods with Moq和中的链接。

我偶然发现了microsoft moles项目,我想也许我可以用它来创建一个替代程序集,通过它我可以测试这个特定的方法。使用Pex生成这样的程序集相对比较容易,但是当我尝试使用这个程序集的方法时,还不清楚有什么方法可以解决这个问题。

理想情况下,我只想进行检查,以确保此方法调用了查询扩展方法,并返回了抢占的结果。

有没有人做过类似的事情,想听听大家的想法。

Ps。有mock类型,但我没有资金购买它:)

EN

回答 1

Stack Overflow用户

发布于 2010-11-18 06:14:18

扩展方法是静态方法。所以你不能使用像Rhino Mocks或Moq这样的模仿库。(这是CLR限制。)TypeMock或Moles通过在剖析器级别将自己楔入来绕过限制。(它们将自己注册为分析器,并将代码注入您的应用程序域。)

您可以使用与NHibernate.Linq.LinqExtensionMethods中相同的签名来定义您自己的扩展方法:

代码语言:javascript
复制
// NOT RECOMMENDED!!!
public static class MockedSessionExtensions {
    public static IQueryable<T> Query<T>(this ISession session) {
        // your mocked impl goes here
    }
}

这样做的问题是,它必须在您的生产代码中包含一些条件编译指令。

就我个人而言,我会针对本地数据库或内存中的数据库(如SQLite )集成测试我的存储库。然后,我在测试更高级别的组件时模拟我的存储库。我不建议模仿ISession、ISessionFactory和类似的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4209298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档