Что делает CreateMany с семенем?

Что на самом деле делает перегрузка CreateMany с параметром T seed? Я пытался засеять, но затравка, похоже, не влияет на созданные объекты. Например, я ожидал, что если у моего семени будет свойство типа string, то либо:

  • строковое значение будет использоваться для заполнения этого свойства во всех вновь созданных объектах.

  • или строковое значение будет использоваться в качестве префикса при установке этого свойства во всех вновь созданных объектах.


person SFun28    schedule 11.02.2015    source источник


Ответы (1)


tl;dr

Как правило, AutoFixture не гарантировать, как начальные значения будут использоваться в процессе создания, если вообще будут использоваться. Эта характеристика связана со способом AutoFixture.

Фон

Каждый раз, когда AutoFixture предлагается создать объект определенного Type, запрос направляется через конвейер объектов под названием "builders". Каждый строитель отвечает за обработку определенного типа запроса (будь то запрос на конкретный тип, интерфейс, свойство, поле и т. д.). Если строитель встречает запрос, который он может обработать, он вернет для него значение, и конвейер перезапустится со следующим запросом.

Учитывая вышеизложенное, если вы хотите создать объект на основе начального числа, все, что может сделать AutoFixture, — это убедиться, что указанное вами начальное значение встраивается в запрос, отправляемый по конвейеру. Затем строители должны решить, что делать с этим значением.

Решение

AutoFixture в настоящее время поставляется с одним компоновщиком, который учитывает начальные значения, и это для строк.

Однако вы можете указать AutoFixture, как он должен использовать начальные значения при создании объектов любого типа, настроив Fixture специально для этого типа с помощью метод FromSeed:

var fixture = new Fixture();
fixture.Customize<Foo>(c =>
    c.FromSeed(seed =>
        {
            // return an instance of Foo
            // that uses the seed value in some way
        }));

Фабрика, которую вы предоставляете FromSeed, будет вызываться каждый раз, когда AutoFixture должна создать экземпляр Foo, и ей будет передано начальное значение из Fixture. Например, учитывая это:

fixture.CreateMany<Foo>(seed: new Foo { Bar = "baz" });

параметр seed фабричной функции получит начальный объект Foo, у которого свойство Bar установлено на "baz".

person Enrico Campidoglio    schedule 12.02.2015
comment
+1 FWIW, мы рассматриваем возможность (повторного) перемещения исходных перегрузок в AutoFixture версии 4 github.com /AutoFixture/AutoFixture/issues/151 - person Mark Seemann; 13.02.2015