是否可以配置 AutoFixture,以便为某个属性(例如名称)从列表中选择一个值?
F.e.
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"
}
我想限制字符串属性的可能值,这可能吗?它与伪造的 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
)。可能需要更高级的版本,但这个可以开始。