使用自动固定填充装置的集合特性

  • 本文关键字:装置 集合 填充 autofixture
  • 更新时间 :
  • 英文 :


我刚刚开始使用AutoFixture,我正在学习基础知识(从我所看到的还有很多),但我遇到了一个问题,我不能100%确定这样的东西的最佳实践是什么。

我正在测试一个控制器,部分过程是操作可以返回两个视图中的一个。

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

因此,我正在考虑对这种行为进行一些测试,但返回的fixture数据会有所不同。一个会返回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);

这个编译和测试运行(并失败),但子类别的计数总是为0,所以我认为我对在do中创建多个的调用都是错误的(它看起来有点错误,但我仍然不确定应该用什么来替换它)。

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

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

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

是的,Build是正确的。


如果要自定义单个Category的创建算法,请使用Build:

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

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

fixture.Customize<Category>(c => c
    .With(x => x.SubCategories,
        fixture.CreateMany<Category>().ToList()));
var actual = fixture.Create<Category>();
Assert.NotEmpty(actual.SubCategories);

希望基本的API能在这里帮助我

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

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

考虑,而不是将列表批发分配给一处房产

  • 使collection属性为只读,并让客户端调用Add
  • 将集合作为构造函数参数,而不是更改属性

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

在第一种情况下,AutoFixture不做任何开箱即用的事情,而是有一个AddManyTo扩展方法,使您能够在一条语句中填充集合:

fixture.AddManyTo(category.SubCategories);

您可以使用自定义列表执行此存根:

var stub = _fixture.Build<Entity>().With(x=> x.field, config).CreateMany().ToList();

文件。

最新更新