测试时,以下行因空引用而失败:
var awards = _session.QueryOver<Body>().Where(x => x.BusinessId == (int)business).List();
我的测试是这样的:
var mockQueryOver = new Mock<IQueryOver<Body, Body>>();
mockQueryOver.Setup(q => q.List()).Returns(new List<Body> {_awardingBody});
_mockSession.Setup(c => c.QueryOver<Body>()).Returns((mockQueryOver.Object));
_mockCommandRunner = new Mock<ICommandRunner>();
_generator = new CertificateGeneratorForOpenSSLCommandLine(_mockSession.Object, _mockCommandRunner.Object, _mockDirectory.Object, _mockFile.Object, _mockConfig.Object);
老实说,我在这里摸不着头脑 - 我对 nHibernate 和 Moq 比较陌生,所以我不太确定要通过 google 搜索什么才能获得正确的信息。
最佳答案
这不是一个好主意。你不应该 mock the types you don't own .相反,你应该引入一个 Repository ,基于领域/业务语言的接口(interface),并使用 NHibernate 实现它。实现可以使用 ICriteria、HQL、QueryOver、Linq 等。关键是这个决定将被封装并隐藏在使用存储库的代码中。
您可以编写一个集成测试来测试您的界面+真实ORM+真实或假数据库的组合。请看this和 this有关测试存储库和数据访问的答案。测试使用 Repository 的代码也非常容易,因为您可以模拟 Repository 接口(interface)。
除了可测试性之外,这种方法还有哪些优势?它们之间有些关联:
- 关注点分离。在数据访问层(存储库实现)解决数据访问问题。
- 松耦合。系统的其余部分未与当今的数据访问工具耦合。您有可能将存储库实现从 NHibernate 切换到原始 sql、azure、web 服务。即使您永远不需要切换,如果您设计得“好像”需要切换,分层也会更好地实现。
- 可读性。领域对象(包括存储库接口(interface)定义)基于业务/领域语言。
关于c# - 使用 Moq 模拟 nHibernate QueryOver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7513681/