XUnit 和 AutoFixture

问题描述 投票:0回答:1

是否可以配置 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?

c# .net unit-testing xunit autofixture
1个回答
0
投票

是的。在 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
)。可能需要更高级的版本,但这个可以开始。

© www.soinside.com 2019 - 2024. All rights reserved.