Bogus、AutoFixture、others(?):如何用虚假数据填充嵌套模型并为特定属性设置规则?

Thy*_*ari 7 c# testing mocking autofixture bogus

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

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

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

我是否遗漏了什么,或者不可能用假数据填充模型并且只为特定属性设置规则?

Bri*_*vez 9

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

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

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

希望有帮助!
布赖恩


Mar*_*ann 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);
}
Run Code Online (Sandbox Code Playgroud)

这种特殊的定制改变了所有属性的规则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);
}
Run Code Online (Sandbox Code Playgroud)

此选项还要求您编写一个自定义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";
    }
}
Run Code Online (Sandbox Code Playgroud)

该规则将适用于所有string名为"Text",无论它们是在哪个类上定义的。

AutoFixture 附带了丰富的 API,使您能够以更简洁的方式表达许多此类规则,但这些是主要的构建块。


上面的两个例子都使用了这个MyClass

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

    public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)