具有复杂子属性的.NET AutoFixture

问题描述 投票:0回答:1

我正在探索使用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.FooId将与myBar.Foo.Id的值不同。创建子集合也存在同样的问题。如何在不手动连接所有ID的情况下克服此问题?

c# .net unit-testing autofixture
1个回答
2
投票

你能试试这个:

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 for AutoFixture中初始化导航属性

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

© www.soinside.com 2019 - 2024. All rights reserved.