unit-testing - 实现一个假的 NHibernate 存储库

标签 unit-testing nhibernate repository-pattern

我正在使用 StoryQ 来执行一些基本的集成测试,并且我们使用 NHibernate 作为我们的 ORM。 当我开始时,我不知道 NHibernate 实现了存储库模式,因此我创建了自己的 IRepository 来运行我的集成测试。

但是,考虑到 NHibernate 已经实现了存储库模式,我认为它是针对某种接口(interface)这样做的。因此,如果我的假设正确的话,我想使用 NHibernate 的存储库接口(interface)。

我试图搜索它,但我发现了一些信息,为此我需要针对 ISession 接口(interface)进行工作。由于我不太了解 NHibernate,有人可以解释为什么我需要针对 ISession 接口(interface)实现我的假存储库吗? NHibernate 中的 IRepository 等价物是什么?是否有一些教程可以更深入地探讨这个问题?

最佳答案

NHibernate 没有实现存储库模式。它取代了它。

如果您有一个简单的数据库实现,那么 SQLite 内存数据库会很好,但我发现事情很快就会变得很麻烦,几乎到了使用 SQLite 变得同样痛苦的程度,甚至更痛苦。它是 stub /模拟 ISession/ICriteria/等。

一个完美的例子:在我最近的一个项目中,我使用 PostgreSQL 作为我的生产数据库,使用 SQLite 作为我的测试数据库,我需要扩展 NHibernate 以添加对最近发布的聚合函数的支持添加到 PostgreSQL。弄清楚如何添加这个本身就是一个故事,但我解决了。然后我必须在 SQLite 中找到一个功能相当的东西。我需要一个聚合函数,其工作方式与 Postgres 的对应函数完全相同。没有。我四处打听,被告知有一些方法可以扩展 NHibernate 以在 SQLite 中“伪造”此功能。我还可以选择扩展 SQLite 来添加此功能。

我想做的就是围绕我试图实现的场景编写两个,也许三个测试。我最终花了太多时间试图确保两个系统之间的功能等效。为了一个功能付出如此多的努力是不值得的。如果以后我需要添加另一个功能会发生什么?

我认为 SQLite 很有用。这是一个很棒的轻量级数据库系统,我喜欢您可以方便地将它用作简单场景的内存数据库。但是,我不确定除此之外它是否值得使用。我想从现在开始,我将在所有环境中使用相同的数据库,即使这意味着对所有数据持久性逻辑进行较慢的集成测试。

关于unit-testing - 实现一个假的 NHibernate 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6162329/

相关文章:

nhibernate - 在 NHibernate 中使用 Postgres 聚合函数

c# - 存储库测试最大限度地减少重复

php - 如何向现有应用程序添加测试?

java - 使用 EasyMock 模拟内部对象方法调用

.net - 我如何回顾性地为 .NET 应用程序创建单元测试?

python - 如何模拟类方法的 cls 参数?

c# - 简单的一对多 fluent-nhibernate

c# - 来自不同程序集的 Fluent nhibernate automap 子类

model-view-controller - 存储库模式 : What is the 'right size' ?

c# - 如何在不同的 Controller 中实现调用另一个 Action 的 Controller Action ?