【问题标题】:Setting up complex object that contain circular references to other complex objects for Unit Testing为单元测试设置包含对其他复杂对象的循环引用的复杂对象
【发布时间】:2015-11-19 16:21:48
【问题描述】:

我正在对依赖于其他存储库接口和服务接口的业务服务进行单元测试。这些依赖项返回包含对其他复杂对象的循环引用的复杂对象。我正在使用 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;}
}

【问题讨论】:

    标签: c# entity-framework unit-testing moq xunit.net


    【解决方案1】:

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

    1. 如果您更改对象结构并错过在测试中进行相同更改,则会出现编译时错误。
    2. 工具自动对对象定义进行级联更改的可能性会流向测试中的代码(例如 VS、Resharper)。

    也许还有其他工具可以帮助缓解这些问题,但为什么在不需要时会引入更多复杂性。

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

    【讨论】:

    • 这很好,如果我对类的属性进行更改,那么 json 必须相应地更新。
    • 在代码中设置模拟数据时遇到的困难是填充循环引用。例如,Foo 包含许多条,一个条包含一个 foo。有什么建议吗?
    • 它们是如何正常构建的?它们是延迟加载还是这些循环依赖项有可设置的属性?如果您包含一个更具体的示例可能会有所帮助,这样我们肯定会在同一页面上。
    • 通过实体框架延迟加载 6. 我将尝试包含一个示例。
    • 我应该注意到,当我进行单元测试时,我正在模拟存储库的接口,因此不使用 EF
    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2021-07-14
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多