0

我目前正在使用 Bogus 创建一组虚假数据规则。这些将被一组模拟服务使用。我的意思是我正在创建一个搜索服务的模拟,它提供伪造的数据。

对于大多数服务,输入的搜索条件应该会影响输出的数据(例如,如果您的服务搜索位于墨西哥的组织,伪造的数据应该只包括位于墨西哥的地址)。如果您搜索名称以“Micro*”开头的组织,我希望能够使用此输入来影响数据的生成方式。

到目前为止,我已经能够通过子类化Faker并提供我自己的Generate方法来获取一些输入数据来做到这一点。然后我可以调用该Faker.Generate()方法,允许它提供一些数据,然后在将其传回之前更改某些字段。

这种方法在一定程度上有效,但不是特别灵活,我觉得应该有更好的方法来做到这一点。我在下面粘贴了此解决方法的示例。

// This shows my current workaround
public static Organization Generate(string searchCode)
{
    var organization = Faker.Generate();
    organization.Code = searchCode;
    return organization;
}
4

1 回答 1

1

我认为有很多方法可以做到这一点,但这真的取决于你的情况。您应该做的第一件事是考虑您的对象图有多深或多复杂。

所以,作为一个粗略的指南......

  • 如果您的对象图很深且很复杂,请考虑使用Faker外观来伪造对象。这意味着创建static工厂方法,例如:
void Main()
{
   Search("Micro*").Dump();
}

public Organization Search(string search)
{
   return CreateOrganization(code: search);
}

static Organization CreateOrganization(string code = null){
   var faker = new Faker();
   //setup complicated child dependency graphs here.
   //then finally create your parent object below.
   return new Organization{
      Code = code ?? faker.Company.CompanyName()
   };
}

public class Organization
{
   public string Code { get; set; }
}

  • 如果您正在生成没有非常大或复杂的对象图的 POCO/DTO 类型的对象,那么使用Faker<T>应该也能很好地工作。例如:
void Main()
{
   Search("Micro*").Dump();
}

public Organization Search(string code){
   var customOrgFaker = Fakers.OrgFaker.RuleFor(x => x.Code, f => code);
   return customOrgFaker.Generate();
}

static class Fakers{

   public static Faker<Organization> OrgFaker => 
             new Faker<Organization>()
                 .RuleFor(o => o.Code, f => f.Company.CompanyName());

}

请注意,在上面的Faker<T>示例中,我调用.RuleFor(_ => _.Code, ...)了两次,但只有最后一次调用.RuleFor才会适用。在这种情况下.RuleFor(x => x.Code, f => code)是之前的最后一次通话.Generate()。实际上,这就像.RuleFor(o => o.Code, f => f.Company.CompanyName())Fakers.

另请注意,每次.OrgFaker访问该属性时,new Faker<T>都会创建 a。这很好,因为每个属性访问都会为您的消费和定制.OrgFaker创建一个专用实例。Faker<T>

如果这对您不起作用并且您只有一个实例Faker<T>可以使用,您可以使用该Faker<T>.Clone()方法克隆Faker<T>并再次.RuleFor使用发散规则​​调用而不会弄乱Faker<T>.

分手建议...

最重要的是,使用上述任何方法,您的首要任务应该是保持代码干净、清晰和可读。力求最简单和最可维护的解决方案。

希望有帮助!

于 2019-06-21T06:06:29.997 回答