Сейчас я изучаю Akka.Net и пытаюсь написать простого актера из ФСМ. Вчера я провел целый день, пытаясь разгадать следующую загадку. Вот упрощенная версия моего кода:
public MyFSMActor()
{
StartWith(State.A, MyData.Empty);
When(State.A, e => condition0 ? GoTo(State.B) : Stay());
When(State.B, e => condition1 ? condition2 ? Goto(State.C) : GoTo(State.D) : Stay());
When(State.C, e => NotImplementedException());
}
Я проводил модульное тестирование своего класса и проверял, что FSM ведет себя в соответствии со спецификациями, за исключением случаев, когда я пытался проверить случай, когда FSM должен перейти на State.D
. Тест всегда не удался, потому что FSM оставался в State.B
. Мне потребовалось много времени, чтобы понять, что я не указал, что у FSM был State.D
, написав соответствующий
When(State.D, e => Whatever());
Но это действительно озадачило меня, потому что я ожидал, что реализация FSM Akka.Net предупредит меня (выбрасывая исключение или что-то еще), что я пытаюсь перейти в неопределенное состояние. Вместо этого FSM просто остался в текущем состоянии, и я не мог понять, почему.
Итак, мой вопрос: не должен ли Akka.Net предупредить, если пользователь пытается перейти в неопределенное состояние в FSM? Почему этого не делает?