【发布时间】:2013-05-03 12:03:52
【问题描述】:
我正在开发一个应用程序,将 NHibernate 用于 ORM,NUnit 用于单元测试,Ninject 用于我的 DI。我像这样嘲笑 ISession:
var session = new Mock<ISession>();
使用常规的非模拟会话对象,我可以使用 LINQ 扩展方法查询它们,如下所示:
var result = Session.Query<MyEntity>();
但是当我尝试用下面的代码来模拟这个时......
session.Setup(s => s.Query<MyEntity>());
...我得到一个运行时“不支持”异常:
Expression references a method that does not belong to the mocked object: s => s.Query<MyEntity>()
如何在 Moq/NHibernate 中模拟这样的基本查询?
【问题讨论】:
-
只是一个提示 - 不要模拟 ISession。这些测试会给你带来什么好处?恕我直言 - 针对您的 NH 查询编写集成测试。对于您的单元测试,使用 DAO/repositories 等隐藏您自己的类型/接口的 ORM/NH(并改为模拟/存根/伪造这些类型)。
-
@Roger 它给您带来的好处是您不必担心实际数据库的状态。您正在单元测试,这意味着您应该只测试该方法中的代码。您的测试不应该关心是否有人删除了数据库。这不是那个方法的错。
标签: c# linq nhibernate ninject moq