我正在使用 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/