繁体   English   中英

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

[英]Bogus, AutoFixture, others(?): How to fill a nested model with fake data and set rules for specific properties?

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

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

Bogus可以设置类似属性范围的规则,但所有其他属性保持为null - 或者您必须为所有属性定义规则。

我是否遗漏了某些内容,或者是否无法使用虚假数据填充模型并仅为特定属性设置规则?

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

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

此外,您不必选择其中一个。 你可以使用两者。 Bogus有一个Faker类(不是Faker<T> ),你可以在没有流畅设置的情况下使用它,而无需定义模型T Faker类使您可以访问所有数据集以实现真实的数据生成。 所以,你可以'使用虚假 FakerAutoFixture组合对象的约定。 :)

希望有所帮助!
布赖恩

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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM