我正在探索使用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的情况下克服此问题?
你能试试这个:
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。