AutoFixture&;AutoMoq:覆盖对象生成行为

本文关键字:对象 覆盖 amp AutoMoq AutoFixture | 更新日期: 2023-09-27 18:25:49

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

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

AutoFixture&;AutoMoq:覆盖对象生成行为

好的,解决了我的问题。

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

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

我得到了Mark指出的解决方案,并且非常喜欢它适用于一般的POJO,但在我的情况下,我的许多对象都有只能通过构造函数或聚合setter(如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());
    }
}