Как настроить регулярное выражение свойства для 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}"))));

Это приводит к общей ошибке LINQ («Последовательность не содержит элементов») во время создания объекта. Что я делаю не так?

В качестве альтернативы, есть ли способ просто отключить эту функцию? Customize() полезно, но мешает мне использовать Build() без повторения всей той же логики. (Не так ли?)


person ladenedge    schedule 24.07.2015    source источник


Ответы (1)


Вы не можете легко отключить эту функцию, но вы можете легко переопределить ее:

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

Этот тест проходит и выглядит аналогично показанному в вопросе. – Какие еще члены определены в классе Details?

person Nikos Baxevanis    schedule 24.07.2015
comment
Ну, разбить его, как в вашем примере, у меня сработало, хотя разницы, похоже, нет. Должно быть, у меня была опечатка в моей первоначальной конструкции?! В любом случае спасибо за помощь! - person ladenedge; 25.07.2015