如果我正确理解这个问题,那么问题在于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