CodeGo.net>虚假,AutoFixture的,其他(?):如何用...

codeday· 2019-11-11
本文来自 codeday ,作者 codeday
我有一个非常嵌套的模型,我想用虚假数据创建成千上万个.但是,模型中的某些属性也必须在特定范围内或具有特定规则.我看了看这两个假数据生成器:

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

伪造的商品可以为属性范围设置规则,但所有其他属性都为空-否则您必须为所有属性定义规则.

我是否错过了某些东西,或者是否无法用假数据填充模型并仅为特定属性设置规则?

最佳答案
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";
    }
}

该规则将适用于所有称为“文本”的字符串属性,无论它们在哪个类上定义.

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

以上两个示例都使用此MyClass:

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

    public string Text { get; set; }
}