实体框架(代码优先)在内存数据库中进行单元测试

pin*_*mer 5 unit-testing entity-framework

对于单元测试目的,是否可以这样做:

  • 将某种格式的测试数据(XML?)检入源代码管理中
  • 运行单元测试时,从此测试数据中实例化某种内存数据库
  • 在单元测试运行期间,让EF在内存数据库中运行

我们不希望我们的单元测试依赖于特定的外部数据库,并且处于特定的状态.

我们也不想在我们的代码和测试中维护两个不同的"世界",即EF对真实数据库运行的真实世界以及我们的测试针对某种EF模拟运行的假工作.

Lad*_*nka 6

单元测试不应该依赖于任何数据库.对数据库的任何依赖(即使在内存数据库中)都意味着您正在进行集成测试,并且应该针对您将要使用的真实数据库进行集成测试.

我不知道EF的任何XML数据库,但即使它存在,你又回到了你的要求之前:我们也不想在我们的代码和测试中维护两个不同的"世界".每个数据库都有自己的EF提供商,由不同的公司创建.即使是MS SQL Server和MS SQL Server Compact Edition的提供程序也不同,它们之间的切换非常具有挑战性.

你应该做什么:

  • 隐藏一些抽象背后的所有EF用法(包括Linq到实体查询的所有内容)并模拟此抽象而不是EF用于单元测试
  • 对要在生产中使用的实际数据库实现使用集成测试来测试抽象本身

  • 所以你建议创建另一个存储库?我发现存储库主要是试图隐藏EF或其他ORM的问题.DbContext(实现IDbContext)已经是一个存储库. (4认同)