测试时,以下行因空引用而失败:
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 还比较陌生,所以我不太确定要谷歌什么才能获得正确的信息。
这不是一个好主意。你不应该模拟你不拥有的类型。相反,你应该引入一个存储库,其接口基于领域/业务语言并使用 NHibernate 实现。实现可以使用 ICriteria、HQL、QueryOver、Linq 等。重点是这个决策将被封装并隐藏在使用存储库的代码中。
你可以写一个集成测试这将测试你的界面+真正的ORM+真实或假数据库的组合。请看一下this and this有关测试存储库和数据访问的答案。测试使用 Repository 的代码也非常容易,因为您可以模拟 Repository 接口。
除了可测试性之外,这种方法还有什么优点?它们之间有些关联:
- 关注点分离。数据访问问题在数据访问层(存储库实现)中解决。
- 松耦合。系统的其余部分未与当今的数据访问工具耦合。您有可能将存储库实现从 NHibernate 切换到原始 sql、azure、Web 服务。即使您从不需要切换,如果您设计得“好像”需要切换,分层也会得到更好的执行。
- 可读性。领域对象(包括存储库接口定义)基于业务/领域语言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)