如何配置AutoFixture限制指定属性的可选值范围?
可以实现,两种常用方案如下
方案一:自定义AutoDataAttribute(推荐复用场景)
通过继承AutoDataAttribute封装固定规则,后续所有需要生成符合要求的Person实例的测试都能直接复用这个属性。
首先创建自定义属性:
using AutoFixture; using AutoFixture.Xunit2; public class NamedAutoDataAttribute : AutoDataAttribute { // 指定可选的名字列表 private static readonly string[] ValidFirstNames = { "Marc", "Jules", "Tom" }; public NamedAutoDataAttribute() : base(() => new Fixture()) { // 为Person类型定制FirstName的生成规则 Fixture.Customize<Person>(cfg => cfg .With(p => p.FirstName, () => ValidFirstNames[Fixture.Create<Random>().Next(ValidFirstNames.Length)])); } }
然后在测试中使用这个自定义属性:
[Theory, NamedAutoData] public void Test(Person person) { // 验证FirstName确实来自指定列表 Assert.Contains(person.FirstName, new[] { "Marc", "Jules", "Tom" }); }
方案二:单个测试中手动配置Fixture
如果只是某个测试需要特殊规则、无需复用,可以直接在测试里临时配置Fixture实例:
[Theory, AutoData] public void Test(Fixture fixture) { var validFirstNames = new[] { "Marc", "Jules", "Tom" }; // 临时定制Person的FirstName生成逻辑 fixture.Customize<Person>(cfg => cfg .With(p => p.FirstName, () => validFirstNames[fixture.Create<Random>().Next(validFirstNames.Length)])); Person person = fixture.Create<Person>(); Assert.Contains(person.FirstName, validFirstNames); }
两种方案本质都是通过AutoFixture的Customize方法,为目标类型的特定属性绑定「随机选取指定列表值」的生成逻辑,和Bogus的PickRandom()功能逻辑一致。
内容的提问来源于stack exchange,提问作者Maarten Vissers
相关产品推荐
相关产品推荐

