c# - 使用 Moq 模拟 nHibernate QueryOver

标签 c# unit-testing nhibernate moq queryover

测试时,以下行因空引用而失败:

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+真实或假数据库的组合。请看thisthis有关测试存储库和数据访问的答案。测试使用 Repository 的代码也非常容易,因为您可以模拟 Repository 接口(interface)。

除了可测试性之外,这种方法还有哪些优势?它们之间有些关联:

  • 关注点分离。在数据访问层(存储库实现)解决数据访问问题。
  • 松耦合。系统的其余部分未与当今的数据访问工具耦合。您有可能将存储库实现从 NHibernate 切换到原始 sql、azure、web 服务。即使您永远不需要切换,如果您设计得“好像”需要切换,分层也会更好地实现。
  • 可读性。领域对象(包括存储库接口(interface)定义)基于业务/领域语言。

关于c# - 使用 Moq 模拟 nHibernate QueryOver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7513681/

相关文章:

c# - 如何使用 IHttpActionResult 对 Created-201 响应进行编码

c# - 编写事件的简短方法?

.net - 如何在.Net中编写数据访问层测试?

c# - 使用 QueryOver 进行子查询

c# - 编译错误 : The type 'ASP.global_asax' exists in both DLLs

c# - 如何返回自定义匿名类型?

javascript - 创建可单元测试的闭包的最佳模式?

c++ - 使用流将对象转换为字符串

objective-c - 在 UIViewController 中模拟 UIView

c# - hibernate "could not initialize a collection"