【问题标题】:AutoFixture & AutoMoq: Overriding object generation behaviorAutoFixture & AutoMoq:覆盖对象生成行为
【发布时间】:2014-10-07 23:31:59
【问题描述】:

我建议在我们公司使用 AutoFixture 和 AutoFixture.xUnit,并且已经得到授权,对于某些对象和字段,他们需要以预期方式格式化的随机数据。例如,他们希望 PersonName 只填充真实的名称(而不是 GUID),而 PhoneNumber 只填充看起来像电话号码的字符串。但他们不想在执行此操作的实际对象中添加数据注释,他们只是希望 AutoFixture 生成的测试数据漂亮。

我已经处理了一些 ICustomize 类以在一些类上实现贪婪的构造函数行为。是否有类似的方法来覆盖特定对象的数据生成? (例如)从列表中提取名称,或生成数据以遵循某个正则表达式? (请记住,我实际上不能将这些正则表达式作为属性添加到模型上)

【问题讨论】:

  • 这是一个 PoC:blog.ploeh.dk/2010/11/22/…
  • 这很有趣也很有帮助,谢谢。不幸的是,至少正如在博客文章中设置的那样,它似乎不知道如何处理通过构造函数传入的项目。我将继续寻找在每个类的基础上进行自定义的方法,并希望 ObjectHydrator 能够生成数据。
  • 在博文中,它的目标是PropertyInfo 对象。尝试定位 ParameterInfo 对象,你应该很高兴。
  • 这听起来很完美,但我很难弄清楚如何做到这一点,至少在不修改 ObjectHydrator 源的情况下。据我所知,我不能只将示例中的实例更改为 ParameterInfo,因为它们正在与定义 PropertyInfo 的 IMap(在 ObjectHydrator 中)进行比较。关于我需要做些什么来定位 ParameterInfo 有什么建议吗?
  • 啊,对了,好久没看那个代码了。你是对的。 ObjectHydrator 看起来像是耦合到 PropertyInfo...

标签: c# unit-testing xunit autofixture automoq


【解决方案1】:

好的,解决了我的问题。

给定类类型的对象生成可以通过 Fixture.Register 方法完成。您可以创建一个方法来返回您想要覆盖的类型,并且将使用该方法而不是默认值。

为了获得有意义的数据,我使用了 Faker.Net。

我得到了 Mark 指出的解决方案,并且非常喜欢它用于一般 POJO,但在我的情况下,我的许多对象具有只能通过构造函数或聚合设置器(如 ChangeContactInfo)设置的属性,所以很遗憾我需要更有针对性的东西。这是我实现名称和地址生成覆盖的解决方案示例:

public class CustomObjectGeneration : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Register(GenerateAddress); 
        fixture.Register(GeneratePersonName);
    }

    private Address GenerateAddress()
    {
        return new Address(Faker.Address.StreetAddress(), Faker.Address.SecondaryAddress(), Faker.Address.City(),
            Faker.Address.ZipCode(), Faker.Address.UsState(), Faker.Address.Country());
    }

    private PersonName GeneratePersonName()
    {

        return new PersonName(Faker.Name.Prefix(), Faker.Name.First(), Faker.Name.First(), Faker.Name.Last(), Faker.Name.Suffix());
    }

}

【讨论】:

  • 在这种情况下,不应该是POCO而不是POJO吗?
  • POCato POJato。 :) 但是,是的。
猜你喜欢
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多