相关疑难解决方法(0)

使用AutoFixture创建递归树

我刚刚开始使用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,也会发生同样的事情.

我想要几件事.

  • 用空的B列表创建A样本的最佳方法是什么?
  • 什么是最好的方法来创建一个A标本与一些Bs包含几个带有几个孩子的B孩子(一棵小树)?

对于我的遗愿,指定一些递归深度可能会很好,在此之后使用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)

c# unit-testing autofixture

13
推荐指数
1
解决办法
3364
查看次数

如何为特定类自定义 AutoFixture 行为

我需要启用 AutoFixture 来创建具有循环引用的类型实例(来自第三方提供的 API)。为此,我可以删除默认值ThrowingRecursionBehavior,如下所示:

public class RecursiveObjectCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Behaviors.OfType<ThrowingRecursionBehavior>()
            .ToList()
            .ForEach(b => fixture.Behaviors.Remove(b));
        fixture.Behaviors.Add(new OmitOnRecursionBehavior());
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是,我知道ThrowingRecursionBehavior当通过属性应用自定义时,这将删除所有类型的 。如何将修改后的行为限制为仅适用于特定类型?

unit-testing autofixture

3
推荐指数
1
解决办法
1401
查看次数

标签 统计

autofixture ×2

unit-testing ×2

c# ×1