微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 AutoFixture 生成特定格式的数据? 电子邮件语言

如何解决如何使用 AutoFixture 生成特定格式的数据? 电子邮件语言

我有一个模型类用户,如下所示:

public class User
{
    public string UserName{ get; set; }
    public string Language { get; set; }
    public string Email{ get; set; }
}

我使用 XUnit 和 Autofixture 进行单元测试。我有一个测试方法如下:

    [Theory,AutoData]
    public async Task Shouldcreateuser(User user)
    {
      ...
    }

问题在于 Autofixture 为 User 类的所有属性创建随机字符串数据。有没有办法让 Autofixture 返回特定的数据格式,如下所示:

Language --> random data such as "EN","ES"
Email --> random email address: example@mail.com 

解决方法

电子邮件

AutoFixture 能够使用 System.Net.Mail.MailAddress 类型生成电子邮件地址 OOTB。因此,您可以将属性类型从 string 更改为 MailAddress,也可以在测试中手动设置。

[Theory,AutoData]
public void MailAddressTest(MailAddress email)
{
    // Output: email = "7495f4c5-9f5c-4854-9cbd-e9d3bc53dfcd" <7495f4c5-9f5c-4854-9cbd-e9d3bc53dfcd@example.net>
    Console.Out.WriteLine("email = {0}",email);

    // Output: email = 48f2028f-f055-4745-bf1c-f710e141332a@example.com
    Console.Out.WriteLine("email = {0}",email.Address);
}

语言

您可以尝试从 CultureInfo 获取语言代码。不幸的是,默认情况下 AF always generate InvariantCulture。如果您需要更多语言,则必须扩展 AF。这可以通过一个新的样本构建器来完成,它应该从所有可用的文化(或根据您的需要的任何其他文化子集)中随机选择一个文化:

public class RandomCultureGenerator : ISpecimenBuilder
{
    private readonly ExactTypeSpecification _cultureTypeSpecification;
    private readonly CultureInfo[] _cultures;
    private readonly Random _random;

    public RandomCultureGenerator()
    {
        _cultureTypeSpecification = new ExactTypeSpecification(typeof(CultureInfo));
        _cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
        _random = new Random();
    }

    public object Create(object request,ISpecimenContext context)
    {
        if (request == null)
            return new NoSpecimen();

        if (!this._cultureTypeSpecification.IsSatisfiedBy(request))
            return new NoSpecimen();

        var index = _random.Next(_cultures.Length - 1);
        return _cultures[index];
    }
}

用法:

[Fact]
public void GenerateRandomCulture()
{
    var fixture = new Fixture();
    fixture.Customize<CultureInfo>(c => new RandomCultureGenerator());
    var culture = fixture.Create<CultureInfo>();
    Console.Out.WriteLine("culture = {0}",culture.TwoLetterISOLanguageName);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?