Bogus、AutoFixture、其他(?):如何用假数据填充嵌套模型并为特定属性设置规则?
Bogus, AutoFixture, others(?): How to fill a nested model with fake data and set rules for specific properties?
我有一个非常嵌套的模型,我想用假数据创建数千个。但是,模型中的某些属性也需要在特定范围内或具有特定规则。我查看了这两个假数据生成器:
AutoFixture 似乎只会为所有内容生成虚假数据。
Bogus 可以设置属性范围之类的规则,但所有其他属性保持为空 - 或者您必须为所有属性定义规则。
我是不是漏掉了什么,或者无法用假数据填充模型并且只能为特定属性设置规则?
AutoFixture 使您能够在 属性-by-属性 的基础上或按照惯例建立属性规则。
定制一个特定的属性
您可以使用 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
class:
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
属性,无论它们是在哪个 class 上定义的。
AutoFixture 附带了一个丰富的 API,使您能够以更简洁的方式表达许多此类规则,但这些是主要的构建块。
以上两个例子都使用了这个MyClass
:
public class MyClass
{
public int Number { get; set; }
public string Text { get; set; }
}
Bogus has a community extension called AutoBogus 由 Nick Dodd 编写,可让您为模型自动生成规则。
您还可以覆盖 AutoBogus 使用特定值为特定测试创建的自动生成的规则。查看 AutoBogus 自述文件了解更多信息。
此外,您不必二选一。您可以同时使用两者。 Bogus 有一个 Faker
class(不是 Faker<T>
),您可以在没有流畅设置且无需定义模型的情况下使用 T
. Faker
class 使您可以访问所有数据集以生成真实的数据。因此,您可以将 Bogus' Faker
对象与 AutoFixture 的约定结合使用。 :)
希望对您有所帮助!
布莱恩
我有一个非常嵌套的模型,我想用假数据创建数千个。但是,模型中的某些属性也需要在特定范围内或具有特定规则。我查看了这两个假数据生成器:
AutoFixture 似乎只会为所有内容生成虚假数据。
Bogus 可以设置属性范围之类的规则,但所有其他属性保持为空 - 或者您必须为所有属性定义规则。
我是不是漏掉了什么,或者无法用假数据填充模型并且只能为特定属性设置规则?
AutoFixture 使您能够在 属性-by-属性 的基础上或按照惯例建立属性规则。
定制一个特定的属性
您可以使用 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
class:
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
属性,无论它们是在哪个 class 上定义的。
AutoFixture 附带了一个丰富的 API,使您能够以更简洁的方式表达许多此类规则,但这些是主要的构建块。
以上两个例子都使用了这个MyClass
:
public class MyClass
{
public int Number { get; set; }
public string Text { get; set; }
}
Bogus has a community extension called AutoBogus 由 Nick Dodd 编写,可让您为模型自动生成规则。
您还可以覆盖 AutoBogus 使用特定值为特定测试创建的自动生成的规则。查看 AutoBogus 自述文件了解更多信息。
此外,您不必二选一。您可以同时使用两者。 Bogus 有一个 Faker
class(不是 Faker<T>
),您可以在没有流畅设置且无需定义模型的情况下使用 T
. Faker
class 使您可以访问所有数据集以生成真实的数据。因此,您可以将 Bogus' Faker
对象与 AutoFixture 的约定结合使用。 :)
希望对您有所帮助!
布莱恩