Заполнение Собственности Свойство прибора автофиксом
Я только начал использовать AutoFixture, и я изучаю основы (из того, что я вижу, это намного больше), но у меня возникла проблема, и я не уверен на 100%, что лучше всего делать для подобных вещей.
Я тестирую контроллер, и частью процесса является то, что действие может вернуть одно из двух представлений.
- Если у категории есть дети - показать представление списка категорий
- Если категория не имеет детей, покажите представление списка товаров
Итак, я думаю о нескольких тестах для такого поведения, но возвращенные данные о приборах будут другими. Один возвращает счетчик 0, другой - больше, чем ноль, поэтому я хотел бы, чтобы прибор помог мне с этим.
Я искал вокруг, и, возможно, мне нужно было создать какую-то настройку, но надеялся, что базовый API поможет мне здесь. Я попробовал это:
var category = _fixture.Build<Category>()
.Do(x => x.SubCategories = _fixture.CreateMany<Category>(3).ToList())
.Create();
_fakeCategoryService
.Setup(x => x.GetById(id))
.Returns(category);
Это компилирует и запускает тесты (и терпит неудачу), но у подкатегорий всегда есть счетчик 0, так что я думаю, что мой вызов Create Many in the do все неправильный (это выглядит неправильно, но я все еще не уверен, что это должно быть заменено на).
ОБНОВЛЕНИЕ: следует прочитать шпаргалку немного лучше!
var category = _fixture.Build<Category>()
.With(x => x.SubCategories, _fixture.CreateMany<Category>(3).ToList())
.Create();
Это работает, если есть лучший способ, пожалуйста, дайте мне знать.
2 ответа
Да, Build
верно.
Если вы хотите настроить алгоритм создания для одного Category
использование Build
:
var actual = fixture
.Build<Category>()
.With(x => x.SubCategories,
fixture.CreateMany<Category>().ToList())
.Create();
Assert.NotEmpty(actual.SubCategories);
Если вы хотите настроить алгоритм создания для всех Category
случаи использования Customize
:
fixture.Customize<Category>(c => c
.With(x => x.SubCategories,
fixture.CreateMany<Category>().ToList()));
var actual = fixture.Create<Category>();
Assert.NotEmpty(actual.SubCategories);
надеялся, что базовый API может помочь мне здесь
Это поможет вам, если вы знаете, как слушать:) Изначально AutoFixture создавалась как инструмент для разработки через тестирование (TDD), а TDD - это обратная связь. В духе ГСНО, вы должны слушать свои тесты. В этом случае он говорит так же, как Руководство по проектированию платформы:
Вместо того, чтобы назначать оптовый список собственности, рассмотрите
- сделать свойство коллекции доступным только для чтения и позволить клиентам вызывать
Add
, так далее. - принимая коллекцию в качестве параметра конструктора вместо изменяющего свойства
В последнем случае AutoFixture автоматически предоставит заполненную коллекцию при вызове конструктора, хотя в этом конкретном случае, поскольку у вас есть потенциально рекурсивный граф, вам может потребоваться явно обработать его.
В первом случае AutoFixture ничего не делает из коробки, но имеет AddManyTo
метод расширения, позволяющий заполнить коллекцию одним оператором:
fixture.AddManyTo(category.SubCategories);
Вы можете сделать эту заглушку с помощью настраиваемого списка:
var stub = _fixture.Build<Entity>().With(x=> x.field, config).CreateMany().ToList();