【问题标题】:AutoFixture constrained string parameterAutoFixture 约束字符串参数
【发布时间】:2016-11-27 00:45:31
【问题描述】:

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

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

编辑:

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

这一定是很常见的情况,但是我一直在寻找没有运气的日子:(。

赞赏!

【问题讨论】:

  • 你试过[InlineAutoData]吗?
  • 但是我会为 orderby 的每个可能值放置一个 InlineAutoData 吗?如果我只有 20 种可能性,那就太多了!
  • 此外。我想动态地创建可能性,即某种类型的所有属性名称。一定有办法!

标签: asp.net-mvc nunit autofixture


【解决方案1】:

如果我正确理解了这个问题,那么问题是应该从预定义值列表中随机选择 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

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多