Заполнение Собственности Свойство прибора автофиксом

Я только начал использовать 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();

Документация.

Другие вопросы по тегам