Как юнит тестировать конечный автомат? - PullRequest
11 голосов
/ 17 октября 2011

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

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

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

1 Ответ

5 голосов
/ 17 октября 2011

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

  • Класс сущности (Заказ)
  • Классы инфраструктуры состояний

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

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

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