使用自动混合填充夹具的集合属性

Mod*_*ika 5 autofixture

我刚刚开始使用AutoFixture,而且我已经掌握了基础知识(从我可以看到的还有更多内容)但我有一个问题,我不是100%确定这样的事情的最佳做法是什么.

我正在测试一个控制器,而部分进程是动作可以返回两个视图中的一个.

  • 如果某个类别有子项 - 显示类别列表视图
  • 如果某个类别没有子项显示产品列表视图

所以我正在考虑对该行为进行一些测试,但返回的夹具数据会有所不同.一个会返回一个0的计数,另一个会返回一个更大的计数,然后是零,所以我希望夹具帮助我.

我一直在寻找,也许我必须创建某种类型的自定义,但希望基本的API可以帮助我.我试过这个:

var category = _fixture.Build<Category>()
    .Do(x => x.SubCategories = _fixture.CreateMany<Category>(3).ToList())
    .Create();

_fakeCategoryService
    .Setup(x => x.GetById(id))
    .Returns(category);
Run Code Online (Sandbox Code Playgroud)

这编译和测试运行(和失败),但子类别总是有0,所以我认为我在do中调用Create Many是完全错误的(它看起来有点不对,但我仍然不确定它应该是什么替换为).

更新:应该更好地阅读备忘单!

var category = _fixture.Build<Category>()
    .With(x => x.SubCategories, _fixture.CreateMany<Category>(3).ToList())
    .Create();
Run Code Online (Sandbox Code Playgroud)

这有效,如果有更好的方法请告诉我.

Nik*_*nis 8

是的,Build是对的.


如果要为一次性 Category使用自定义创建算法Build:

var actual = fixture
    .Build<Category>()
    .With(x => x.SubCategories, 
        fixture.CreateMany<Category>().ToList())
    .Create();

Assert.NotEmpty(actual.SubCategories);
Run Code Online (Sandbox Code Playgroud)

如果要为所有 Category实例自定义创建算法,请使用 Customize:

fixture.Customize<Category>(c => c
    .With(x => x.SubCategories,
        fixture.CreateMany<Category>().ToList()));

var actual = fixture.Create<Category>();

Assert.NotEmpty(actual.SubCategories);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ann 6

我希望基本的API可以帮助我

如果您知道如何倾听,它确实对您有所帮助:) AutoFixture最初是作为测试驱动开发(TDD)的工具而构建的,而TDD则是关于反馈的.本着GOOS的精神,你应该听听你的测试.在这种情况下,它与框架设计指南的说法相同:

不要提供可设置的集合属性.

考虑,不是将列表批发分配给属性

  • 使集合属性成为只读,并让客户端调用Add,等等.
  • 将集合作为构造函数参数而不是变异属性

在后一种情况下,AutoFixture将在调用构造函数时自动提供填充的集合,尽管在此特定情况下,由于您具有可能的递归图形,因此您可能需要显式处理它.

在第一种情况下,AutoFixture不会开箱即用,但有一个AddManyTo扩展方法,使您可以在一个语句中填充集合:

fixture.AddManyTo(category.SubCategories);
Run Code Online (Sandbox Code Playgroud)