Как unit test конечный автомат?

Предположим, что у меня есть класс Order, который может находиться в трех разных состояниях: CheckedState, PaidState и OrderedState.

Конечный автомат будет реализован с использованием стандартного шаблона проектирования штата (Gof).

Как обычно unit test это? Используете ли вы приспособление для каждого класса состояний (CheckStateFixture, PaidFixture,...) и друг друга (OrderFixture) для класса контекста? Или вы используете только одно приспособление для класса контекста (Order), в которое вы поместите все модульные тесты?

Ответ 1

Я предпочитаю хранить государственную инфраструктуру отдельно от самой сущности. Таким образом, у вас будет

  • Класс сущности (Заказ)
  • Государственные классы инфраструктуры

Для инфраструктуры государств я бы предложил использовать единую привязку для каждого объекта, поэтому одной OrderStateFixture для инфраструктуры состояний заказов будет достаточно.

Основными тестами будут тесты, которые гарантируют правильное состояние заказа:

  • Убедитесь, что начальное состояние заказа не проверено
  • После успешного выполнения метода Order.Paid(amount) Order.State переключится на Paid
  • Если Order.Verify() возвращает true/pass без исключения - Order.State становится проверенным/проверенным