Запись изменений состояния в boost::statechart
Для модульного тестирования я пытаюсь записать все транзакции состояния после запуска события конечного автомата.
Например, если я отправлю событие A в fifo_scheduler async_state_machine, конечный автомат пройдет через состояния B, C, а затем обратно в D. Не имея возможности записать все состояния события, я могу только проверить, что он перешел в состояние D после это было сделано при выполнении юнит-теста:-(
Единственное, о чем я могу думать, - это изменить все методы реагирования или конструкторы всех состояний, которые я создаю (производных от simple_state), чтобы они делали запись. Это кажется немного хакерским, когда я действительно хочу подключиться к async_state_machine как раз перед тем, как он вызывает метод response () состояния...
2 ответа
Это кажется немного хакерским, когда я действительно хочу подключиться к async_state_machine как раз перед тем, как он вызывает метод response () состояния...
Почему не ты? Создайте новый класс, который расширяет async_state_machine
и добавьте желаемые крючки в него. Если доступ является проблемой (вероятно, будет), сделайте все возможное #define private public
(или же protected
взломать, прежде чем включить диаграмму состояний.
Я сделал нечто подобное, чтобы добавить локальные переменные в историю состояния и добавить новый тип state-ctor, чтобы у меня была настоящая полная история.
Добавлен другой хак. Каждое состояние создается до того, как оно используется конечным автоматом форсирования (затем уничтожается после перехода в следующее состояние... кажется таким неэффективным), поэтому каждое состояние было получено из другого класса, который имеет обратный вызов в своем конструкторе. Все еще кажется хаком... желаю, чтобы boost++ имел более чистый способ сделать это:-P