【问题标题】:AutoFixture, create a list of email addressesAutoFixture,创建电子邮件地址列表
【发布时间】:2016-07-21 18:44:18
【问题描述】:

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

public Guid AccountId {get;set;}
public IEnumerable<string> EmailAddresses {get;set;}
etc...

我想使用 autofixture 创建帐户,但在获取电子邮件格式时遇到了问题。

我试过了

fixture.Register<string>(() => string.Format("{0}@acme.com", fixture.Create<string>()));

但这会导致循环问题。

我可以这样做

fixture.Register<string>(() => string.Format("{0}@acme.com", fixture.Create<int>()));

但我宁愿在地址的开头有一个字符串。

编辑 感谢这两个答案,我在这里写了一个摘要和其他一些场景作为帖子 - http://nodogmablog.bryanhogan.net/2016/04/customizing-a-specific-string-inside-a-class-using-autofixture/

【问题讨论】:

    标签: c# unit-testing testing autofixture


    【解决方案1】:

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

    假设MyClass被定义为

    public class MyClass
    {
        public Guid AccountId { get; set; }
        public IEnumerable<string> EmailAddresses { get; set; }
    }
    

    然后,可以像这样自定义Fixture 对象

    var fixture = new Fixture();
    fixture.Customize<MyClass>(c => c
        .With(x =>
            x.EmailAddresses,
            fixture.CreateMany<MailAddress>().Select(x => x.Address)));
    
    var result = fixture.Create<MyClass>();
    

    因此EmailAddresses 将填充如下电子邮件字符串:

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

    【讨论】:

    • 你不想Select(x=&gt; x.Address)吗?邮件地址上的 ToString 会导致 "ecfd3086-48c7-4999-8b5e-c19f9d0875ff" &lt;ecfd3086-48c7-4999-8b5e-c19f9d0875ff@example.net&gt;
    【解决方案2】:

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

    如果EmailAddresses 属性应该只包含有效的电子邮件地址,那么您应该问自己将它们表示为通用字符串是否是the right choice。像MailAddress 类这样更具体的类型将限制该属性的有效值集。 它还可以更轻松地为其生成测试数据,因为 AutoFixture 知道如何创建 MailAddress 的实例。

    话虽如此,如果您无法更改对象模型,您仍然可以编写customization,告诉 AutoFixture 为 IEnumerable&lt;string&gt; 类型的任何属性或参数提供有效的电子邮件地址,email 在某处以他们的名义:

    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);
        }
    }
    

    然后,您可以在 Fixture 中使用该自定义,方法是将其添加到 Customizations 属性:

    fixture.Customizations.Insert(0, new EmailAddressStringsGenerator());
    

    【讨论】:

      【解决方案3】:

      来自自动夹具

      var localPart = fixture.Create<EmailAddressLocalPart>().LocalPart;
      var domain = fixture.Create<DomainPart>().Domain;
      var fullAddress = $"{localPart}@{domain}";
      

      【讨论】:

        猜你喜欢
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2012-07-14
        • 2011-06-04
        • 1970-01-01
        相关资源
        最近更新 更多