XUnit and AutoFixture



是否可以配置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),如果有的话。更高级的版本可能需要,但这个是可以开始的。

相关内容

  • 没有找到相关文章

最新更新