【发布时间】:2025-06-24 11:05:01
【问题描述】:
我刚刚开始使用 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;
}
}
假设由于各种原因我无法轻易更改此结构。
如果我要求我的夹具创建 A ThrowingRecursionBehavior 将开始咆哮 B 是递归的。
如果我用 OmitOnRecursionBehavior 替换 ThrowingRecursionBehavior,我会得到一个 ObjectCreateException。
如果我尝试类似:fixture.Inject(Enumerable.Empty());我从 DictionaryFiller 中得到“已添加具有相同密钥的项目”。如果我将 ThrowingRecursionBehavior 替换为 NullRecursionBehavior,也会发生同样的情况。
有几件事我想做。
- 用空的 B 列表创建 A 样本的最佳方法是什么?
- 创建一个包含几个 B 和几个孩子的 A 和几个 B 的样本(一棵小树)的最佳方法是什么?
对于我的最后一个愿望,最好指定一些递归深度,之后使用 Enumerable.Empty(或零大小的数组/列表,甚至为 null)。 我知道 AutoFixture 的扩展非常灵活。所以我想应该有可能创建一些完全做到这一点的样本生成器。 事实上,我会尝试使用自定义的 ISpecimenBuilder,但也许有人已经有了更智能的解决方案。 例如,在 RecursionGuard 中修改这一行是否有意义:
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Any(x => this.comparer.Equals(x, request)))
...
到
public object Create(object request, ISpecimenContext context)
{
if (this.monitoredRequests.Count(x => this.comparer.Equals(x, request)) > maxAllowedRecursions)
...
【问题讨论】:
标签: c# unit-testing autofixture