我正在尝试模拟或类似于应用于nhibernate-3会话的查询扩展方法。类似于下面的内容...
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类型,但我没有资金购买它:)
发布于 2010-11-18 06:14:18
扩展方法是静态方法。所以你不能使用像Rhino Mocks或Moq这样的模仿库。(这是CLR限制。)TypeMock或Moles通过在剖析器级别将自己楔入来绕过限制。(它们将自己注册为分析器,并将代码注入您的应用程序域。)
您可以使用与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和类似的东西。
https://stackoverflow.com/questions/4209298
复制相似问题