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

时间:2014-10-07 23:32:00

标签: c# unit-testing xunit autofixture automoq

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

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

1 个答案:

答案 0 :(得分:0)

好的,解决了我的问题。

给定类类型的对象生成可以通过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());
    }

}