我刚刚开始使用AutoFixture并拥有这个半复杂的数据结构,我想创建一些标本.在我正在使用的测试中,我不太关心数据结构的内容.我只想要合理的默认值.
此数据结构的一部分是递归树.更具体地说,一个类包含一些其他类的集合,其中包含自身的子列表.类似于:
public class A
{
private IEnumerable<B> bNodes;
public A(IEnumerable<B> bNodes)
{
this.bNodes = bNodes;
}
}
public class B
{
private IEnumerable<B> children;
public B(IEnumerable<B> children)
{
this.children = children;
}
}
Run Code Online (Sandbox Code Playgroud)
让我们假设我出于各种原因无法轻易改变这种结构.
如果我要求我的灯具创建一个ThrowingRecursionBehavior将开始咆哮B是递归的.
如果我用OmitOnRecursionBehavior替换ThrowingRecursionBehavior,我会得到一个ObjectCreateException.
如果我尝试类似:fixture.Inject(Enumerable.Empty()); 我从DictionaryFiller中得到"已添加相同键的项目".如果我用NullRecursionBehavior替换ThrowingRecursionBehavior,也会发生同样的事情.
我想要几件事.
对于我的遗愿,指定一些递归深度可能会很好,在此之后使用Enumerable.Empty(或零大小的数组/ List或甚至为null).我知道AutoFixture可以非常灵活地扩展.因此,我认为应该可以创建一些完全符合这一要求的样本构建器.事实上,我会尝试使用自定义的ISpecimenBuilder,但也许有人已经有了一个更智能的解决方案.例如,在RecursionGuard中修改此行是否有意义:
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Any(x => this.comparer.Equals(x, request)))
...
Run Code Online (Sandbox Code Playgroud)
至
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Count(x => this.comparer.Equals(x, request)) > maxAllowedRecursions)
...
Run Code Online (Sandbox Code Playgroud) 是否可以映射多对多的关系而不在其中一端有导航属性?例如,我有一些小部件和一些可以为特定小部件加注星标的用户.我希望能够看到用户关注哪些小部件,但我并不真正关心所有已经为某个特定小部件加星标的用户
Widget.cs
public int Id { get; set; }
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
User.cs
public int Id { get; set; }
public string Username { get; set; }
public ICollection<Widget> StarredWidgets { get; set; }
Run Code Online (Sandbox Code Playgroud)
通过此设置,EF将生成从窗口小部件到用户的一对多关系.但是,它需要是多对多的.我知道我可以添加public ICollection<User> Users到Widget.cs,只是看是否有解决这个另一种方式.
我正在使用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但也没有设法解决它.