是否有一种简单的方法可以为参数orderBy指定可能的值列表?请不要一个接一个,否则我不会提出问题。我想指定orderby只有在从预定列表中选择时才有意义。假设列表非常大......仍然不是随机的。这不是那么难......没有这么简单的任务的单一例子。
[Test, AutoData]
public override void IndexReturnsView(int? pageIndex, int? pageSize, string orderBy, bool? desc)
{
.....
}
编辑:
我想要的只是读取列表中的可能值,就像我使用ValueSource属性一样。但是,它似乎不适用于AutoFixture。如果我指定例如[ValueSource("GetOrderByColumnNames")]
我的测试不再适用了。我不知道我做错了什么。不幸的是,AutoFixture缺乏有用的文档,这些示例非常基础。是否有一个可用于指导我自己的场景的工作示例?
这必须是一种非常普遍的情况,但是我一直在寻找没有运气的日子:(。
赞赏!
答案 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将检测其存在,然后定制然后启动