我刚刚开始使用AutoFixture,但我的基础知识有所下降(据我了解,它还有很多其他东西),但是我遇到了问题,我不确定100%像这样的事情的最佳实践。

我正在测试 Controller ,过程的一部分是操作可以返回两个 View 之一。

  • 如果类别中有子级-显示类别 ListView
  • 如果类别没有子类别,则显示产品 ListView

  • 因此,我正在考虑对该行为进行一些测试,但是返回的灯具数据将有所不同。一个将返回一个计数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);
    

    关于autofixture - 用自动治具填充治具的Collection属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22993145/

    10-13 03:07