c# - 我如何模拟或类似地注入(inject)对应用于 NHibernate session 的查询扩展方法的替换

标签 c# unit-testing nhibernate extension-methods linq-to-nhibernate

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

public IQueryable<Entity> GetEntities
{
  return entities = Session.Query<Entity>();
}

其中 Query 扩展方法返回一个 IQueryable 集合。

我可以使用 Moq 或 Rhinos 清楚地模拟 session 对象。但目前还没有找到合适的方法来伪造或替换扩展方法。事实上阅读关于堆栈溢出的几个问题的答案,它可能是不可能的。

查看问题 How to mock extension methods with Rhino Mock? Mocking Extension Methods with Moq 以及其中的链接..

我遇到了 microsoft moles项目并认为也许我可以使用它来创建一个替代程序集,通过它我可以测试这个特定的方法。使用 Pex 生成这样的程序集相对容易,但是当我尝试使用此程序集的方法时,它并没有立即清除将其分解的方法。

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

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

附言。有 type mock 但我没有资金购买它:)

最佳答案

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

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

// NOT RECOMMENDED!!!
public static class MockedSessionExtensions {
    public static IQueryable<T> Query<T>(this ISession session) {
        // your mocked impl goes here
    }
}

问题是它必须在您的生产代码中,并且周围有一些条件编译指令。

我个人针对本地数据库或内存数据库(如 SQLite)对我的存储库进行集成测试。然后我在测试更高级别的组件时模拟我的存储库。我不建议模拟 ISession、ISessionFactory 等。

关于c# - 我如何模拟或类似地注入(inject)对应用于 NHibernate session 的查询扩展方法的替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209298/

相关文章:

c# - 如何调用派生类的方法?

c# - Asp.Net Identity 2.0 中的 RoleManager 似乎不支持 Guid

javascript - 在 Karma/Jasmine 单元测试中注入(inject) Angular 的 $timeout 服务的实际实现

java - 如何为createNewToken方法编写测试方法?

c# - 使用 EF 对数字和字母字符串进行排序

c# - 选择什么 .NET 版本?

java - 在多模块 Maven 项目中构建阶段之前运行单元测试

nHibernate 不在命令行上运行的 MSTests 中创建 Oracle 驱动程序

.net - 如何在运行时在代码中获取NHibernate生成的SQL?

.net - 是否可以使用流畅的 nhibernate 映射设置 SQL 服务器列的描述?