C# 为单元测试设置包含对其他复杂对象的循环引用的复杂对象

C# 为单元测试设置包含对其他复杂对象的循环引用的复杂对象,c#,entity-framework,unit-testing,moq,xunit.net,C#,Entity Framework,Unit Testing,Moq,Xunit.net,我正在对依赖于其他存储库接口和服务接口的业务服务进行单元测试。这些依赖项返回包含对其他复杂对象的循环引用的复杂对象。我使用MOQ模拟这些依赖项,并设置它们的例程以返回复杂对象。然后,我验证测试中的业务服务是否返回正确的结果 由于这些复杂对象的复杂性,创建一个表示这些复杂对象的JSON文件并将其反序列化为我正在设置的模拟对象是一个好主意吗?你的想法是什么 需要完全填充以进行测试的复杂对象示例: public class Foo{ property int Id {get; set;}

我正在对依赖于其他存储库接口和服务接口的业务服务进行单元测试。这些依赖项返回包含对其他复杂对象的循环引用的复杂对象。我使用MOQ模拟这些依赖项,并设置它们的例程以返回复杂对象。然后,我验证测试中的业务服务是否返回正确的结果

由于这些复杂对象的复杂性,创建一个表示这些复杂对象的JSON文件并将其反序列化为我正在设置的模拟对象是一个好主意吗?你的想法是什么

需要完全填充以进行测试的复杂对象示例:

public class Foo{
    property int Id {get; set;}
    property virtual ICollection<Bar> Bars {get; set;}
}

public class Bar{
    property int Id {get; set;}
    property int BarId {get; set;}
    property virtual Foo Foo {get; set;}
}
公共类Foo{
属性int Id{get;set;}
属性虚拟ICollection条{get;set;}
}
公共类酒吧{
属性int Id{get;set;}
属性int BarId{get;set;}
属性虚拟Foo Foo{get;set;}
}

我个人并不喜欢这个想法。通过在代码中创建对象,您可以获得两个巨大的好处

  • 如果您更改了对象结构,并且没有在测试中进行相同的更改,则会出现编译时错误
  • 工具可以自动将对象定义的级联更改流到测试中的代码中(例如VS、Resharper)
  • 也许还有其他工具可以帮助缓解这些问题,但为什么在不需要的时候引入更多的复杂性呢


    事实上,除非您的应用程序实际以相同的方式创建对象,否则创建特定于您使用的反序列化程序的对象可能会有一些细微的差别,这有助于隐藏缺陷。

    这是一个很好的观点,如果我对类的属性进行了更改,那么json必须相应地更新。在代码中设置模拟数据的困难在于填充循环引用。e、 例如,Foo包含许多条,而一个条包含一个Foo。有什么建议吗?它们是如何正常建造的?它们是延迟加载的还是这些循环依赖项有可设置的属性?如果您提供了一个更具体的示例,那么我们肯定会在同一页上。通过EntityFramework 6加载Lazy。我将尝试包括一个示例,但是我应该注意,当我进行单元测试时,我模拟了存储库的接口,因此没有使用EF