AutoFixture создает свойство с правилом регулярного выражения

Недавно я применил этот атрибут шаблона регулярного выражения к одному из свойств в моем классе, чтобы оценить допустимость форматы URL. Теперь возникла проблема, что AutoFixture не может создать его экземпляр, отображающий ошибку

«AutoFixture не удалось создать экземпляр из Ploeh.AutoFixture.Kernel.RegularExpressionRequest, скорее всего, потому, что он не имеет общедоступного конструктора, является абстрактным или закрытым типом».

Я попробовал несколько предложений, таких как

var contact = _fixture.Build<ContactEntity>()
   .With(c=>c.Customer.Website,
     new SpecimenContext(_fixture)
       .Resolve(new RegularExpressionRequest(Constants.UrlRegex)))
   .Create();

а также

public class WebsiteSpecimenBuilder: ISpecimenBuilder
{
    public object Create(object request,
    ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi!=null && pi.PropertyType == typeof(string) 
            && (pi.Name.Equals("Email") || pi.Name.Equals("Website")))
        {
            //tried both of these options
            return (new OmitSpecimen() || "http://www.website.com";
        }

        return new NoSpecimen(request);
    }
}

Но я все еще не могу заставить autofixture создать класс. Я что-то упустил, чтобы создать его, или это регулярное выражение слишком сложно для автоматической фиксации?


person Nik M    schedule 30.03.2015    source источник
comment
Возможно, связано: stackoverflow.com/q/28706286/126014   -  person Mark Seemann    schedule 30.03.2015
comment
Какое именно регулярное выражение вы пытаетесь использовать? Эта суть, кажется, имеет много похожих.   -  person Nikos Baxevanis    schedule 30.03.2015
comment
Я использую версию взорванной строки в приложении .net. Я внес небольшие изменения для работы с .net, протестировал и увидел, что он работает так, как ожидалось. Я нашел более простое регулярное выражение, которое, похоже, работает с автофиксацией. Но сейчас, кажется, происходит странная вещь. if (pi != null && pi.PropertyType == typeof(string)) { if (pi.Name == "Email") { return "[email protected]"; } if (pi.Name == "Website") { return "http://www.blah.com"; }} return new NoSpecimen(request); Autofixture, кажется, перезаписывает его на Website: "http://0#"   -  person Nik M    schedule 31.03.2015


Ответы (2)


Кажется, я получил решение, используя метод настройки как таковой:

_fixture = new Fixture();
_fixture.Customize<CustomerEntity>(ce => 
    ce.With(x => x.Website, "http://suchTest.verwow"));

Это возвращает любой экземпляр, в котором клиенту предлагается иметь этот веб-сайт (или другие свойства регулярного выражения). Я действительно не знаю, имеет ли что-то в автоисправлении приоритет в отношении того, почему этот сработал при настройке веб-сайта, а другие - нет. Но это решение, которое позволяет моему тестированию работать

person Nik M    schedule 31.03.2015

Вы должны проверить регулярное выражение, которое передается в RegularExpressionRequest().

new RegularExpressionRequest(Constants.UrlRegex)

Регулярное выражение должно быть типа генерации, а не проверки. Например, это может быть следующим

string TopicSuffixValidation = @"[a-zA-Z0-9]{1,5}/[a-zA-Z0-9]{1,5}"
person SRi    schedule 19.07.2020
comment
Можете ли вы объяснить разницу между типами генерации и проверки регулярного выражения? Являются ли они терминами с четко определенным значением? - person AdrianHHH; 20.07.2020