首页 > 解决方案 > 使用 AutoFixture 构建组合数据

问题描述

我是 AutoFixture 的新手,特别是在寻找一种创建组合数据的方法。

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

var firstnames = new[] { "John", "Jane", ... };
var lastnames = new[] { "Doe", "Smith", ... };

var persons = Fixture.CreateMany<Person>().ToList();

现在我想创建一个Person包含所有名字和姓氏组合的类列表。有没有办法用 AutoFixture 做到这一点?我找不到这种情况的任何例子。

标签: c#unit-testingautofixture

解决方案


AutoFixture 没有任何允许创建组合数据的功能。但是,理论上您可以集成一个生成器类,该生成器类创建全名并通过扩展类实例Person

其他工具很可能可以更有效地生成组合数据,但出于演示目的,我们假设您可以使用以下 LINQ 查询生成所有全名组合。

from firstName in firstNames
from lastName in lastNames
select new FullName(firstName, lastName);

您可以将此序列封装到ISpecimenBuilder将保留最后生成的名称对的状态的 a 中。例如使用IEnumerator.

这将允许您在生成Person实例以注入 和 的值时使用此构建FirstNameLastName

您可以查看此Gist以了解更多详细信息。

最后你应该有看起来像这样的测试。

[Fact]
public void GeneratesCombinatorialNames()
{
    var firstNames = new[] {"Jake", "Lana"};
    var lastNames = new[] {"Gates", "Morris"};
    var fixture = new Fixture().Customize(new PersonCustomization(firstNames, lastNames));
    var expected1 = new[]
    {
        new Person("Jake", "Gates"),
        new Person("Jake", "Morris"),
        new Person("Lana", "Gates")
    };
    var expected2 = new[]
    {
        new Person("Lana", "Morris"),
        new Person("Jake", "Gates"),
        new Person("Jake", "Morris")
    };

    var people1 = fixture.CreateMany<Person>();
    var people2 = fixture.CreateMany<Person>();

    Assert.Equal(expected1, people1.ToArray());
    Assert.Equal(expected2, people2.ToArray());
}

推荐阅读