虚假数据生成工具Bogus、AutoFixture等:如何为特定属性设置规则并填充嵌套模型的假数据?

13

我有一个非常嵌套的模型,要用虚假数据创建数千个。但是,模型中的一些属性需要在特定范围内或具有特定规则。我看过以下两个虚假数据生成器:

AutoFixture似乎只为所有内容生成虚假数据。

Bogus可以为属性设置范围等规则,但所有其他属性仍为空 - 或者您必须为所有属性定义规则。

我错过了什么,还是不可能填充模型以使用虚假数据,并仅为特定属性设置规则?

2个回答

16

Bogus有一个名为AutoBogus的社区扩展,由Nick Dodd编写,可以自动生成模型规则。

您还可以使用特定值覆盖AutoBogus创建的自动生成规则以进行特定测试。请查看AutoBogus自述文件以获取更多信息。

此外,您不必选择其中之一。您可以同时使用两者。 Bogus有一个Faker类(而不是Faker<T>),您可以在没有流畅设置且无需定义模型T的情况下使用它。 Faker类使您可以访问用于生成真实数据的所有数据集。因此,您可以将BogusFaker对象与AutoFixture的约定一起使用。 :)

希望这有所帮助!
Brian


6
AutoFixture可以让你针对属性建立规则,无论是逐个属性还是按照约定来实现。

自定义特定属性

你可以使用Customize来改变特定类型的行为,包括属性:

[Fact]
public void CustomizeSpecificProperty()
{
    var fixture = new Fixture();
    fixture.Customize<MyClass>(c => c.With(mo => mo.Number, 42));

    var actual = fixture.Create<MyClass>();

    Assert.Equal(42, actual.Number);
}

这个定制化功能是针对所有MyClass.Number属性更改规则,其值将始终为42。

按照惯例进行定制化

您还可以通过惯例匹配各种属性,通常是通过查看属性类型和名称的组合:

[Fact]
public void CustomizeTextPropertyByConvention()
{
    var fixture = new Fixture();
    fixture.Customizations.Add(new TextPropertyBuilder());

    var actual = fixture.Create<MyClass>();

    Assert.Equal("Foo", actual.Text);
}

此选项还需要您编写自定义的TextPropertyBuilder类:

public class TextPropertyBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;
        if (pi == null || pi.Name != "Text" || pi.PropertyType != typeof(string))
            return new NoSpecimen();

        return "Foo";
    }
}

此规则适用于所有名为"Text"string属性,无论它们定义在哪个类中。

AutoFixture拥有丰富的API,可以更简洁地表达许多这样的规则,但这些是主要的构建块。


上面两个示例都使用了这个MyClass

public class MyClass
{
    public int Number { get; set; }

    public string Text { get; set; }
}

在第一个示例中使用 fixture.Create<MyClass>();,类中的所有其他属性也会有内容吗? - Thypari
1
@Thypari 是的 https://github.com/AutoFixture/AutoFixture/wiki/Cheat-Sheet#complex-type - Mark Seemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接