C# 具有复杂子属性的.NET AutoFixture

C# 具有复杂子属性的.NET AutoFixture,c#,.net,unit-testing,autofixture,C#,.net,Unit Testing,Autofixture,我正在探索使用AutoFixture为单元测试创建一些测试数据。到目前为止,看起来这将为我们节省大量的代码/维护。我现在唯一的问题是,当创建一个对象时,它上面的复杂子对象将无法正确连接ID。我正试图找到一种方法来优雅地克服这个问题,而不是在创建对象后手动连接ID。见下例: public class Bar { public int Id {get; set;} public string Name {get; set;} public Foo Foo {get; se

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

你能试试这个吗:

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()
var obj=myFixture
.Build()
.没有(b=>b.Foo)
.Without(b=>b.FooId)
.Do(b=>
{
b、 Foo=fixture.Create();
b、 FooId=fixture.Create();
b、 Foo.Id=b.FooId;
})
.Create()
或者,您可以检查此选项,它支持在EF中为AutoFixture初始化导航属性

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

你能试试这个吗

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()
var obj=myFixture
.Build()
.没有(b=>b.Foo)
.Without(b=>b.FooId)
.Do(b=>
{
b、 Foo=fixture.Create();
b、 FooId=fixture.Create();
b、 Foo.Id=b.FooId;
})
.Create()
或者,您可以检查此选项,它支持在EF中为AutoFixture初始化导航属性

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


你的回答非常接近。我需要添加
b.Foo=_fixture.Create()
作为
.Do
块中的第一行,因为
b.Foo.Id
会给出空引用异常。如果你想更新你的答案,我很乐意接受。为了记录在案,我还将研究您链接的包,因为看起来我可以用更少的工作/代码完成类似的事情。谢谢你的回答非常接近。我需要添加
b.Foo=_fixture.Create()
作为
.Do
块中的第一行,因为
b.Foo.Id
会给出空引用异常。如果你想更新你的答案,我很乐意接受。为了记录在案,我还将研究您链接的包,因为看起来我可以用更少的工作/代码完成类似的事情。谢谢