Nodejs Testing. Как избежать условий гонки? - PullRequest
2 голосов
/ 24 марта 2012

Я сейчас пишу игровой движок в nodejs.

В моей игре несколько состояний.Давайте назовем их StateA, StateB, StateC.Поток последовательности: StateA => StateB => StateC.

Я хотел бы проверить состояние моего двигателя в конце каждого состояния.В настоящее время у меня есть такая структура:

function attachEventListeners = function(instance) {
  instance.on('START_STATE_A', stateA);
  instance.on('START_STATE_B', stateB);
  instance.on('START_STATE_C', stateC);
}

var stateACallBack = function() {};
var stateBCallBack = function() {};
var stateCCallBack = function() {};

function stateA() { 
  // Do something...
  stateACallBack();
  setTimeout(function() { this.emit('START_STATE_B'); }, 3000)
}

function stateB() { 
  // Do something...
  stateBCallBack();
  setTimeout(function() { this.emit('START_STATE_C'); }, 3000)
}

function stateC() { 
  // Do something...
  stateCCallBack();
  setTimeout(function() { this.emit('START_STATE_A'); }, 3000)
}

Таким образом, мой текущий подход предполагает переопределение тестовых случаев в StateXCallback и выполнение логики тестирования в этих функциях.

Однако я вижу состояние гонки, при которомStateB запускается до того, как stateACallBack завершит выполнение.В результате, stateACallback видит состояния, которые должны оцениваться с помощью stateBCallback.

Я попытался внедрить время задержки между состояниями, однако это приводит к дополнительным ошибкам состояния гонки в моей кодовой базе.

Может кто-нибудь, пожалуйста, просветить меня лучше подход к этой проблеме?

1 Ответ

1 голос
/ 24 марта 2012

Довольно сложно обсуждать это так абстрактно, но мне кажется, что то, что вы называете состояниями, на самом деле не состояния, а асинхронные события. Каждое из этих событий может изменить внутреннее состояние конечного автомата, но это зависит от порядка, в котором получено событие. Я не уверен, является ли единственный триггер для события B событием A, но я предполагаю, что нет. (Если это так, то зачем разделять события на отдельные события A, B и C? Кажется произвольным и бессмысленным, почему бы просто не вызвать каждый обратный вызов по очереди?).

Итак, чтобы реализовать конечный автомат, где-то вам нужна переменная, которая отслеживает текущее состояние, в котором находится компьютер. Когда событие получено, обратный вызов должен решить, использовать ли событие и продвигать конечный автомат, или поместите его в очередь и подождите, пока машина не перейдет в другое состояние.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...