在AutoFixture中创建复杂子项时使用父属性的值

Nik*_*erg 8 c# autofixture

我正在使用AutoFixture为涉及父对象和复杂子对象的结构生成数据,如下所示:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Child[] Children { get; set; }
}

public class Child
{
    public string Name { get; set; }
    public int ParentId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法自动将ParentId生成的Child对象的属性设置为分配给父级的id?现在我的解决方案看起来像这样,这不是很漂亮:

var parent = fixture.Build<Parent>().Without(p => p.Children).CreateAnonymous();
parent.Children = fixture.CreateMany<Child>(10).ToArray();

foreach (var i in parent.Children)
{
    i.ParentId = parent.Id;
}
Run Code Online (Sandbox Code Playgroud)

感觉就像有一种更好的方法来做到这一点,我失踪了?我考虑创建一个自定义,ISpecimenBuilder但也没有设法解决它.

Mar*_*ann 5

AutoFixture基于一组有关可能要求使用的API的规则和假设.考虑它是在没有任何先验知识ChildParent类或给定API中的任何其他类型的情况下创建和编译的.所有必须使用的是公共API.

将AutoFixture视为一个非常朦胧的程序员,甚至不懂你的语言(甚至不是英语).更防呆可以使你的API,越容易将使用AutoFixture它.

像这里描述的父/子关系这样的循环引用的问题在于它破坏了封装.您最初需要在无效状态下创建至少一个类实例.使AutoFixture与这样的API一起工作很困难应该主要作为API可能从重构中受益的警告信号.

此外,.NET Framework设计指南建议不要将数组作为属性公开 - 特别是可写属性.因此,使用更好的封装设计,API可能更容易使用,无论是AutoFixture还是您自己和您的同事.

鉴于上面的API,我认为没有任何方法可以使这更容易使用.考虑如何删除循环引用并使集合属性为只读,这将更容易.

为了记录,我多年没有编写带循环引用的API,因此很可能避免这些父/子关系.