是否可以配置AutoFixture,以便从列表中选择某个属性(例如名称)的值?
初版
public class Person
{
public string FirstName { get; set; }
}
在我的测试:
[Theory, AutoData]
public void Test(Person person)
{
// person.FirstName can only be one of these names: "Marc, Jules, Tom"
}
我想限制字符串属性的可能值,这是可能的吗?它与Bogus PickRandom()…
相当。可能从AutoDataAttribute继承?
是的。在AutoFixture中实现了一个类似的功能来生成域名。
您可以找到DomainNameGenerator的采用版本,它从预定义的列表中选择人名:
public class PersonNameGenerator : ISpecimenBuilder
{
private readonly ElementsBuilder<string> _nameBuilder =
new ElementsBuilder<string>("Marc", "Jules", "Tom");
public object Create(object request, ISpecimenContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (request == null || !typeof(Person).Equals(request))
return new NoSpecimen();
var firstName = this._nameBuilder.Create(typeof(string), context) as string;
if (firstName == null)
return new NoSpecimen();
return new Person { FirstName = firstName };
}
}
现在需要注册新的生成器:
public class MyAutoDataAttribute : AutoDataAttribute
{
public MyAutoDataAttribute()
: base(() =>
{
var fixture = new Fixture();
fixture.Customizations.Insert(0, new PersonNameGenerator());
return fixture;
})
{
}
}
正在运行的名称生成器:
[Theory, MyAutoData]
public void Test(Person person)
{
Console.Out.WriteLine("person.FirstName = {0}", person.FirstName);
// writes:
// person.FirstName = Tom
// person.FirstName = Jules
// person.FirstName = Marc
}
请注意,此实现不会生成其他道具(例如LastName
),如果有的话。更高级的版本可能需要,但这个是可以开始的。