【问题标题】:Bogus, AutoFixture, others(?): How to fill a nested model with fake data and set rules for specific properties?Bogus,AutoFixture,其他(?):如何用假数据填充嵌套模型并为特定属性设置规则?
【发布时间】:2018-06-21 21:09:21
【问题描述】:

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

AutoFixture 似乎只会为所有事物生成虚假数据。

Bogus 可以为属性设置范围等规则,但所有其他属性仍然为空 - 或者您必须为所有这些属性定义规则。

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

【问题讨论】:

    标签: c# testing mocking autofixture bogus


    【解决方案1】:

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

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

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

    希望对您有所帮助!
    布赖恩

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      相关资源
      最近更新 更多