我有一个非常嵌套的模型,我想用假数据创建数千个。但是,模型中的某些属性也需要在特定范围内或具有特定规则。我看了看这两个假数据生成器:
AutoFixture 似乎只会为所有内容生成虚假数据。
Bogus 可以设置类似属性范围的规则,但所有其他属性保持为null - 或者您必须为所有属性定义规则。
我是否遗漏了某些内容,或者是否无法使用虚假数据填充模型并仅为特定属性设置规则?
答案 0 :(得分:2)
Bogus有一个名为AutoBogus的社区扩展程序,由 Nick Dodd 编写,可让您自动为模型生成规则。
您还可以覆盖使用特定测试的特定值创建的 AutoBogus 的自动生成规则。查看AutoBogus自述文件了解更多信息。
此外,您不必选择其中一个。你可以使用两者。 Bogus 有一个Faker
类(不是Faker<T>
),您可以在没有流畅设置且无需定义模型T
的情况下使用该类。 Faker
类使您可以访问所有数据集以实现真实的数据生成。所以,你可以使用 Bogus &#39; Faker
对象与 AutoFixture 的约定相结合。 :)
希望有所帮助! 布赖恩
答案 1 :(得分:1)
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";
}
}
此规则将适用于名为string
的所有"Text"
属性,无论它们是在哪个类中定义。
AutoFixture附带了一个丰富的API,可以让您以更简洁的方式表达许多此类规则,但这些是主要构建块。
以上两个示例均使用此MyClass
:
public class MyClass
{
public int Number { get; set; }
public string Text { get; set; }
}