我正在尝试模拟或类似应用于 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/