【问题标题】:Populating a Collection Property of a fixture with autofixture使用自动固定装置填充固定装置的集合属性
【发布时间】:2014-04-10 16:00:00
【问题描述】:

我刚刚开始使用 AutoFixture,我正在学习基础知识(据我所知,还有更多内容),但我遇到了问题,我不能 100% 确定什么是最佳实践像这样。

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

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

所以我正在考虑对该行为进行一些测试,但返回的夹具数据会有所不同。一个会返回一个 0 的计数,另一个会返回一个大于 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 中对 Create Many 的调用都是错误的(看起来有点错误,但我仍然不确定是什么它应该替换为)。

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

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

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

【问题讨论】:

    标签: autofixture


    【解决方案1】:

    是的,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);
    

    【讨论】:

    • 感谢补充信息,非常感谢!
    【解决方案2】:

    希望基本 API 可以在这里帮助我

    如果您知道如何倾听,它确实会对您有所帮助:) AutoFixture 最初是作为测试驱动开发 (TDD) 的工具而构建的,而 TDD 完全是关于反馈。本着GOOS 的精神,您应该聆听您的测试。在这种情况下,它的含义与Framework Design Guidelines 相同:

    DO NOT provide settable collection properties.

    与其将列表批发分配给物业,不如考虑

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

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

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

    fixture.AddManyTo(category.SubCategories);
    

    【讨论】:

    • 我的意思是我弄错了,不是 API 错了 :) 感谢您提供更多信息,我会研究一下。我想我在你的博客上看到了 AddManyTo 函数的一个例子!
    • 嗨,马克,这个应用程序不是最大的,所以 Category 类是用于 EF 的类,所以我不相信(必须再次检查)你可以在它不是可设置的情况下工作财产。对于一个纯域对象,我得到你。
    • 很久没用EF了,相信你说的没错:/
    【解决方案3】:

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

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

    Documentation.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多