实现存储库模式并进行测试

时间:2012-09-09 09:45:42

标签: entity-framework unit-testing integration-testing repository-pattern

我已经阅读了几乎所有关于Repository模式及其不同实现的文章。他们中的许多人都认为不好的做法(例如:使用IQueryable<T>代替IList<T>)等等,这就是为什么我仍然被卡住而无法达到正确的做法。

所以:

  • 我是否需要存储库模式才能在我的MVVM应用程序中应用IoC?

  • 如果是,对于EF实体的有效IRepository实施是什么,这是一种很好的做法并且更容易测试?

  • 如何测试我的存储库和UnitofWork行为?在内存存储库中进行单元测试?整合测试?

编辑:根据答案,我添加了第一个问题。

2 个答案:

答案 0 :(得分:3)

Ayende Rahien有很多关于存储库http://ayende.com/blog/search?q=repository的帖子以及为什么在使用ORM时它很糟糕。我认为Repository是要走的路。也许是在2004年。现在不是。 ORM已经实现了存储库。在EF的情况下,它是IDbSet。而DbContext是UnitOfWork。创建存储库以包装EF或其他ORM会增加许多不必要的复杂性。

对将与数据库交互的代码进行集成测试。

答案 1 :(得分:1)

当您使用EF时,存储库模式会添加一个额外的层,因此您应该确保需要这种额外的间接层。

存储库模式的最初想法是保护上面的层免受数据库结构的复杂性和了解。在许多方面,EF的ORM模型保护代码免受数据库中的物理实现的影响,因此对存储库的需求较少。

有两种基本选择:

  • 让业务层直接与EF模型对话
  • 构建实现Repository模式的数据层,此层将EF对象映射到POCO

对于测试:

  • 当我们直接使用EF时,我们使用带回滚的事务范围,以便测试不会更改数据。
  • 当我们使用存储库模式时,我们使用Rhino Mocks来模拟存储库

我们使用这两种方法,Repository模式提供了更清晰的分层应用程序,因此可能更多控制,使用EF直接为应用程序提供更少的代码,因此构建速度更快。