Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 用于单元测试的内存数据库中的实体框架(代码优先)_Entity Framework_Unit Testing - Fatal编程技术网

Entity framework 用于单元测试的内存数据库中的实体框架(代码优先)

Entity framework 用于单元测试的内存数据库中的实体框架(代码优先),entity-framework,unit-testing,Entity Framework,Unit Testing,出于单元测试目的,是否可以执行以下操作: 将某种格式(XML?)的测试数据签入源代码管理 当运行单元测试时,从该测试数据实例化某种内存中的数据库 在单元测试运行期间,让EF针对该内存中数据库运行 ? 我们不希望我们的单元测试依赖于存在的特定外部数据库,并且处于特定状态 我们也不想在代码和测试中维护两个不同的“世界”,一个是EF运行在真实db上的真实世界,另一个是我们的测试运行在某种EF模拟上的虚假工作。单元测试不应该依赖于任何数据库。对数据库(甚至内存数据库)的任何依赖性都意味着您正在进行集

出于单元测试目的,是否可以执行以下操作:

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

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


我们也不想在代码和测试中维护两个不同的“世界”,一个是EF运行在真实db上的真实世界,另一个是我们的测试运行在某种EF模拟上的虚假工作。

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

我不知道EF有任何XML数据库,但即使它存在,您也可以回到您的需求前面:我们也不希望在代码和测试中维护两个不同的“世界”。每个数据库都有自己的EF提供者,由不同的公司创建。即使是MS SQL Server和MS SQL Server Compact Edition的提供程序也有很大的不同,这使得在它们之间切换非常具有挑战性

你应该做什么:

  • 将所有EF使用隐藏在某个抽象背后(包括所有内容,包括Linq到实体查询),并模拟此抽象,而不是单元测试的EF
  • 针对您希望在生产中使用的真实数据库实现使用集成测试来测试抽象本身

我看到了矛盾。您不想使用真实的数据库,也不想使用假的数据库。那么,您想使用什么呢?他想使用内存中的空白数据库进行测试,从EF:s的角度来看,这是真实的,但在测试运行之间不是持久的,测试不依赖于外部数据库服务器。因此,您是否建议创建另一个存储库?我看到存储库试图隐藏EF或其他ORM的问题。DbContext(实现IDbContext)已经是一个存储库。