AutoFixture 约束字符串参数

2023-12-01

有没有一种简单的方法来指定参数 orderBy 的可能值列表?请不要一一列举,否则我也不会提问。我想指定 orderby 仅当从预定列表中选择时才有意义。假设列表非常大......仍然不是随机的。这不可能那么难……没有一个例子可以说明如此简单的任务。

[Test, AutoData]
public override void IndexReturnsView(int? pageIndex, int? pageSize, string orderBy, bool? desc)
{
    .....
}

EDIT:

我想要的只是从列表中读取可能的值,就像我对 ValueSource 属性所做的那样。但是,它似乎不适用于 AutoFixture。如果我指定例如[ValueSource("GetOrderByColumnNames")]我的测试不再起作用了。我不知道我做错了什么。不幸的是,AutoFixture 缺乏有用的文档,并且示例非常基础。是否有此场景的工作示例可供我用来指导自己?

这一定是一种非常常见的情况,但是我已经找了好几天了,但没有运气:(。

赞赏!


如果我正确理解这个问题,那么问题在于orderBy值应该从预定义值列表中随机选择,但该列表可能太大而无法使用[InlineAutoData].

我能想到的最简单的方法是引入辅助类型。这实际上可能是对应用程序代码本身的有价值的补充,因为它使各种值的作用更加明确,但如果没有,您始终可以将包装器类型添加到测试代码库中。

您至少需要这样的东西:

public class OrderCriterion
{
    public OrderCriterion(string value)
    {
        Value = value;
    }

    public string Value { get; }
}

如果我们还想象这个类公开了一个列表ValidValues,您可以使用以下方法实现 AutoFixture 自定义ElementsBuilder class:

public class OrderCriterionCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(
            new ElementsBuilder<OrderCriterion>(OrderCriterion.ValidValues));
    }
}

然后,为测试代码库创建一个数据源属性:

public class TestConventionsAttribute : AutoDataAttribute
{
    public TestConventionsAttribute() : base(
        () => new Fixture().Customize(new OrderCriterionCustomization()))
    {
    }
}

这使您能够编写这样的测试,该测试可以通过:

[Theory, TestConventions]
public void IndexReturnsView(
    int? pageIndex,
    int? pageSize,
    OrderCriterion orderBy,
    bool? desc)
{
    Assert.Contains(orderBy.Value, OrderCriterion.ValidValues.Select(x => x.Value));
}

请注意,而不是声明orderBy参数作为string,您将其声明为OrderCriterion,这意味着 AutoFixture 将检测到其存在,然后开始定制。

也可以看看https://stackoverflow.com/a/48903199/126014

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AutoFixture 约束字符串参数 的相关文章

随机推荐