如何为 AutoFixture 自定义属性的正则表达式?

lad*_*dge 3 autofixture

我刚刚更改了[RegularExpression]验证,三分之一的单元测试失败了!

事实证明 AutoFixture 是基于那个正则表达式生成值,这很酷,但它不能理解所有的正则表达式,所以我想提供一个更简单的:

Fixtures.Customize<Details>(c => c.With(d => d.PhoneNumber,
     new SpecimenContext(Fixtures).Resolve(
     new RegularExpressionRequest(@"[2-9]\d{2}-\d{3}-\d{4}"))));
Run Code Online (Sandbox Code Playgroud)

这最终在对象创建时给了我一个通用的 LINQ 错误(“序列不包含元素。”)。我究竟做错了什么?

或者,有什么办法可以关闭此功能? Customize()很有帮助,但它阻止我在Build()不重复所有相同逻辑的情况下使用。(不是吗?)

Nik*_*nis 6

您无法轻松关闭该功能,但可以轻松覆盖它:

public class Details
{
    [RegularExpression(@"?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$")]
    public string PhoneNumber { get; set; }
}

public class DetailsTests
{
    [Fact]
    public void OverridePhoneNumberRegularExpression()
    {
        var fixture = new Fixture();
        var pattern = @"[2-9]\d{2}-\d{3}-\d{4}";
        var phoneNumber =
            new SpecimenContext(fixture).Resolve(
                new RegularExpressionRequest(pattern));
        fixture.Customize<Details>(c => c
            .With(x => x.PhoneNumber, phoneNumber));
        var sut = fixture.Create<Details>();

        var actual = sut.PhoneNumber;

        Assert.True(Regex.IsMatch(actual, pattern));
    }
}
Run Code Online (Sandbox Code Playgroud)

此测试通过并且看起来与问题中显示的测试相似。–Details类中定义了哪些其他成员?