【问题标题】:.NET AutoFixture with complex child properties具有复杂子属性的 .NET AutoFixture
【发布时间】:2018-09-07 12:54:00
【问题描述】:

我正在探索使用AutoFixture 来处理为单元测试创​​建一些测试数据。到目前为止,看起来这将为我们节省相当多的代码/维护。我现在唯一的问题是,在创建对象时,其上的复杂子对象不会正确连接 ID。我试图找到一种方法来优雅地克服这个问题,而不是在创建对象后手动连接 ID。请参见下面的示例:

public class Bar
{
    public int Id {get; set;}

    public string Name {get; set;}

    public Foo Foo {get; set;}

    public int FooId {get; set;}
}

public class Foo
{
    public int Id {get; set}

    public string Description {get; set;}
}

在此示例中,调用 var myBar = myFixture.Create<Bar>() 将填充 Bar 及其子属性 Foo 的所有属性。我的问题是myBar.FooIdmyBar.Foo.Id 的值不同。创建子集合也存在同样的问题。在不手动连接我的所有 ID 的情况下如何克服这个问题?

【问题讨论】:

    标签: c# .net unit-testing autofixture


    【解决方案1】:

    你可以试试这个:

    var obj = myFixture
        .Build<Bar>()
        .Without(b => b.Foo)
        .Without(b => b.FooId)
        .Do(b =>
            {
                b.Foo = fixture.Create<Foo>();
                b.FooId = fixture.Create<int>();
                b.Foo.Id = b.FooId;
            })
        .Create()
    

    或者你可以查看这个3rd package,它支持在 EF 中为 AutoFixture 初始化导航属性

    当拦截器创建一个新的导航对象时,它会检查 对于匹配的 int ____Id 属性。如果存在,它将设置 Id 新对象的属性,以便 foo.BarId == foo.Bar.Id。这也是 当表的名称包含在 Id 属性中时适用,因此 foo.BarId == foo.Bar.BarId。

    【讨论】:

    • 您的答案非常接近。我需要将b.Foo = _fixture.Create&lt;Foo&gt;(); 添加为.Do 块中的第一行,因为b.Foo.Id 否则会给出空引用异常。如果你想更新你的答案,我很乐意接受。作为记录,我还将查看您链接的包,因为看起来我可以通过更少的工作/代码完成类似的事情。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多