Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

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
C# 管理复杂单元测试模拟数据_C#_Entity Framework_Unit Testing_Moq - Fatal编程技术网

C# 管理复杂单元测试模拟数据

C# 管理复杂单元测试模拟数据,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,我想对依赖于相当复杂的数据库结构(嵌套、循环引用等)的代码进行单元测试。通常我会这样做: var personRepository = new Mock<IPersonRepository>(); personRepository.Setup(r => r.GetPerson()).Returns( new Person() { FirstName = "Joe", LastName = "Smith" }); var personRepository=n

我想对依赖于相当复杂的数据库结构(嵌套、循环引用等)的代码进行单元测试。通常我会这样做:

var personRepository = new Mock<IPersonRepository>();
personRepository.Setup(r => r.GetPerson()).Returns(
new Person() 
{ 
    FirstName = "Joe",
    LastName = "Smith"
});
var personRepository=new Mock();
personRepository.Setup(r=>r.GetPerson())。返回(
新人()
{ 
FirstName=“乔”,
LastName=“史密斯”
});
我的“复杂”数据的问题是,我觉得我的测试被模拟数据弄得乱七八糟。我有什么选择?我考虑将数据保存为.json文件,我想这是可行的。理想情况下,我希望使用数据库快照的内存表示。可以使用EF6吗?还有其他建议吗?

您可能想看看,该建议旨在允许您对使用实体框架的代码进行单元测试

它将查看您的数据库,并构建一个内存中的版本,该版本的行为与真实版本类似,但可以为每个测试重新创建。然后,您可以编写一些代码,用您的数据填充伪数据库,使您能够对其进行测试。

您可能想看看,它的设计目的是让您能够对使用实体框架的代码进行单元测试


它将查看您的数据库,并构建一个内存中的版本,该版本的行为与真实版本类似,但可以为每个测试重新创建。然后,您可以编写一些代码,用您的数据填充伪数据库,以便对其进行测试。

为什么不将复杂的测试数据表示形式提取到一个单独的类中,或者创建一个工厂方法?@DanielMann您的意思是在类似于测试助手类的东西中管理模拟数据?没错。根据我的经验,将测试数据从代码中提取出来并转换成其他表示形式(可以是JSON、XML、excel电子表格等)没有增加可维护性。为什么不将复杂的测试数据表示形式提取到一个单独的类中,或者创建一个工厂方法?@DanielMann你的意思是在类似于测试助手类的东西中管理模拟数据?没错。根据我的经验,将测试数据从代码中提取出来并放入其他表示形式(可以是JSON、XML、excel电子表格等等)并不能提高可维护性。谢谢,这正是我想要的。内存中的数据库可以从实际的数据库中填充吗?@filur我想你可以通过编写代码来查询数据库来手动填充,但是这会远离单元测试的概念,单元测试应该独立于这些事情。我认为这样做的目的是编写一些代码来填充工作数据库,因此您总是使用已知状态启动uni测试。从真实数据库填充将是不确定的,因为这将取决于数据库是否不变。如果您的数据在数据库中,您可以编写一个一次性脚本来生成C#,以填充工作数据库。做过类似的事情。是的,我在考虑有一个指定的测试数据库来加载数据。可以与他们的一个数据加载器一起使用。@filur我不认为内置的功能会带来效果,我想这会降低单元测试的速度。我会从代码中填充。谢谢,这正是我想要的。内存中的数据库可以从实际的数据库中填充吗?@filur我想你可以通过编写代码来查询数据库来手动填充,但是这会远离单元测试的概念,单元测试应该独立于这些事情。我认为这样做的目的是编写一些代码来填充工作数据库,因此您总是使用已知状态启动uni测试。从真实数据库填充将是不确定的,因为这将取决于数据库是否不变。如果您的数据在数据库中,您可以编写一个一次性脚本来生成C#,以填充工作数据库。做过类似的事情。是的,我在考虑有一个指定的测试数据库来加载数据。可以与他们的一个数据加载器一起使用。@filur我不认为内置的功能会带来效果,我想这会降低单元测试的速度。我将从代码中填充。