C# AutoFixture,创建电子邮件地址列表

C# AutoFixture,创建电子邮件地址列表,c#,unit-testing,testing,autofixture,C#,Unit Testing,Testing,Autofixture,我正在编写一些单元测试,有一个名为Account的类 public Guid AccountId {get;set;} public IEnumerable<string> EmailAddresses {get;set;} etc... 公共Guid帐户ID{get;set;} 公共IEnumerable电子邮件地址{get;set;} 等 我想使用autofixture创建帐户,但获取电子邮件格式时遇到问题 我试过了 fixture.Register<string>

我正在编写一些单元测试,有一个名为
Account
的类

public Guid AccountId {get;set;}
public IEnumerable<string> EmailAddresses {get;set;}
etc...
公共Guid帐户ID{get;set;}
公共IEnumerable电子邮件地址{get;set;}
等
我想使用autofixture创建帐户,但获取电子邮件格式时遇到问题

我试过了

fixture.Register<string>(() => string.Format("{0}@acme.com", fixture.Create<string>()));
fixture.Register(()=>string.Format(“{0}@acme.com”,fixture.Create());
但这导致了循环问题

我能做到

fixture.Register<string>(() => string.Format("{0}@acme.com", fixture.Create<int>()));
fixture.Register(()=>string.Format(“{0}@acme.com”,fixture.Create());
但我希望在地址的开头有一个字符串

编辑
多亏了这两个答案,我在这里写了一个总结和一些其他场景作为帖子-

有几种方法可以做到这一点。以下是其中之一:

假设
MyClass
定义为

公共类MyClass
{
公共Guid帐户ID{get;set;}
公共IEnumerable电子邮件地址{get;set;}
}
然后,可以像这样定制
Fixture
对象

var fixture=newfixture();
fixture.Customize(c=>c
.With(x=>
x、 电子邮件地址,
fixture.CreateMany().Select(x=>x.Address));
var result=fixture.Create();
因此,
电子邮件地址
将填充如下电子邮件字符串:

"18e743af-89ae-46b7-b38e-ff51425ec745@example.org"
"928bd85d-7d89-4cca-bff3-a12d5da6fe29@example.org"
"61db1178-8af9-489f-ba44-95c6393d84a9@example.com"

这是AutoFixture向您提供对象模型可用性反馈的情况之一

如果
EmailAddresses
属性应该只包含有效的电子邮件地址,那么您应该问问自己是否需要将它们表示为通用字符串。更具体的类型(如类)将限制该属性的有效值集。 由于AutoFixture知道如何创建的实例,因此它还可以更容易地为其生成测试数据

话虽如此,如果更改对象模型对您来说不可行,您仍然可以编写一个命令,告诉AutoFixture在其名称中的某个位置为任何
IEnumerable
类型的属性或参数提供有效的电子邮件地址:

public class EmailAddressStringsGenerator : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        if (IsEnumerableOfStringPropertyOrParameterNamedEmail(request))
        {
            return CreateManyEmailAddresses(context);
        }

        return new NoSpecimen();
    }

    static bool IsEnumerableOfStringPropertyOrParameterNamedEmail(object request)
    {
        return IsEnumerableOfStringPropertyNamedEmail(request) ||
               IsEnumerableOfStringParameterNamedEmail(request);
    }

    static bool IsEnumerableOfStringPropertyNamedEmail(object request)
    {
        var property = request as PropertyInfo;
        return property != null &&
               property.Name.ContainsIgnoringCase("email") &&
               typeof(IEnumerable<string>).IsAssignableFrom(property.PropertyType);
    }

    static bool IsEnumerableOfStringParameterNamedEmail(object request)
    {
        var parameter = request as ParameterInfo;
        return parameter != null &&
               parameter.Name.ContainsIgnoringCase("email") &&
               typeof(IEnumerable<string>).IsAssignableFrom(parameter.ParameterType);
    }

    static IEnumerable<string> CreateManyEmailAddresses(ISpecimenContext context)
    {
        var addresses = (IEnumerable<MailAddress>) 
            context.Resolve(typeof(IEnumerable<MailAddress>));
        return addresses.Select(a => a.Address);
    }
}
您不想
选择(x=>x.Address)
?在a邮件地址上搜索导致“ecfd3086-48c7-4999-8b5e-c19f9d0875ff”
fixture.Customizations.Insert(0, new EmailAddressStringsGenerator());