AutoFixture约束字符串参数

时间:2016-11-27 00:45:32

标签: asp.net-mvc nunit autofixture

是否有一种简单的方法可以为参数orderBy指定可能的值列表?请不要一个接一个,否则我不会提出问题。我想指定orderby只有在从预定列表中选择时才有意义。假设列表非常大......仍然不是随机的。这不是那么难......没有这么简单的任务的单一例子。

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

编辑:

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

这必须是一种非常普遍的情况,但是我一直在寻找没有运气的日子:(。

赞赏!

1 个答案:

答案 0 :(得分:0)

如果我正确理解了问题,问题是应该从预定义值列表中随机选择orderBy值,但该列表可能太大而无法与[InlineAutoData]一起使用。

我能想到的最简单的方法是引入辅助类型。 This might actually be a valuable addition to the application code itself,因为它使各种值的作用更明确,但如果没有,您可以随时将包装类型添加到测试代码库。

这样的事情是你需要的最低限度:

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

    public string Value { get; }
}

如果我们还想象此类公开ValidValues列表,您可以使用ElementsBuilder类实现AutoFixture自定义:

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