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
会给出空引用异常。如果你想更新你的答案,我很乐意接受。为了记录在案,我还将研究您链接的包,因为看起来我可以用更少的工作/代码完成类似的事情。谢谢