Как создавать новые экземпляры объектов с помощью настраиваемого SpecimenBuilder с AutoFixture - PullRequest
1 голос
/ 26 мая 2020

В настоящее время у меня есть такой код:

private ConnectedClient WithConnection(IConnection connection)
{
    var builder = new ClientWithConnectionSpecimenBuilder(connection);

    Fixture.Customizations.Add(builder);
    var client = Fixture.Create<ConnectedClient>();
    Fixture.Customizations.Remove(builder);

    return client;
}

В основном мне нужно создать новые экземпляры класса ConnectedClient в моем тестовом коде с указанным подключением. И я создал для этого специальный конструктор образцов.

Но нет такого метода, как

Fixture.Create<T>(specimenBuilder) 

, поэтому мне нужно настроить приспособление.

«Fixture» - это унаследованное защищенное свойство моего базового класса тестов, которое уже настроен с некоторыми пользовательскими настройками AutoMoqData, поэтому мне нужно повторно использовать его для создания объектов.

1 Ответ

1 голос
/ 03 июня 2020

Должна быть возможность использовать одноразовый метод Build для настройки с использованием конкретного конструктора образцов:

var client = fixture.Build<ConnectedClient>().FromFactory(builder).Create();

Обратите внимание, что выполнение этого действия приведет к отключению любых других настроек приспособления.

DSL поддерживает немного больше настроек, используя With и Without, поэтому, если есть дополнительная настройка, которую вы хотите сделать для свойств, вы можете сделать это:

var client = fixture.Build<ConnectedClient>()
    .FromFactory(builder)
    .With(cc => cc.SomeProperty, () => fixture.Build<T>().FromFactory(otherFactory).Create())
    .Create();

Но это будет довольно утомительно для значительной настройки. Таким образом, Autofixture самоуверен.

Метод Build действительно задуман как разовое решение. Если вы хотите больше полагаться на механизм Autofixture, чтобы делать все , кроме для создания клиентского соединения, я бы предложил полагаться на существующий метод Freeze и атрибут Frozen, чтобы сохранить введенные IConnection то же самое для заданного ConnectedClient, что избавит от необходимости указывать c ISpecimenBuilder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...