使用AutoFixture为字符串属性生成匿名数字

5
我正在进行映射方法的单元测试,其中我有一个类型为字符串的源属性被映射到一个整数类型的目标属性。
因此,我希望AutoFixture创建一个具有特定字符串属性的匿名整数源对象,而不是所有字符串属性都是整数。这种方式是否可行?
1个回答

9
这个问题的最佳解决方法是创建一个基于约定的自定义值生成器(create a convention based custom value generator),它根据属性名称分配匿名数值的字符串表示形式作为具体属性的值。
因此,举个例子,假设你有这样一个类:
public class Foo
{
    public string StringThatReallyIsANumber { get; set; }
}

自定义值生成器应该长这样:
public class StringThatReallyIsANumberGenerator : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var targetProperty = request as PropertyInfo;

        if (targetProperty == null)
        {
            return new NoSpecimen(request);
        }

        if (targetProperty.Name != "StringThatReallyIsANumber")
        {
            return new NoSpecimen(request);
        }

        var value = context.CreateAnonymous<int>();

        return value.ToString();
    }
}

重点是自定义生成器仅针对名称为StringThatReallyIsANumber的属性,这在本例中是我们的约定
为了在测试中使用它,您只需要通过Fixture.Customizations集合将其添加到Fixture实例中即可。
var fixture = new Fixture();
fixture.Customizations.Add(new StringThatReallyIsANumberGenerator());

var anonymousFoo = fixture.CreateAnonymous<Foo>();

谢谢,我稍微更新了这个类,所以构造函数现在需要一个参数作为属性的名称。这样我就可以在其他地方使用这个类了。 - Krimson
1
这也对我有所帮助,因为我需要生成特定字符串属性的有效URL而不是基于GUID的默认值。 - Sam Storie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接