Nodejs测试。如何避免竞争条件?

时间:2012-03-24 08:41:27

标签: testing node.js

我目前正在nodejs中编写游戏引擎。

我的游戏有几个州。我们称之为StateA,StateB,StateC。序列流是StateA => StateB =>卢森堡统计局。

我想在每个州结束时测试我的引擎的状态。我目前有这种结构:

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 个答案:

答案 0 :(得分:1)

以这种抽象的方式讨论这个很难,但在我看来,你所谓的状态并不是真正的状态,它们是异步事件。这些事件中的每一个都可能会更改状态机的内部状态,但这取决于接收事件的顺序。我不确定事件B的唯一触发器是事件A,但我假设没有。 (如果是,那么为什么要将事件分成单独的事件A,B和C?看似任意且毫无意义,为什么不依次调用每个回调?)。

因此,要实现状态机,您需要一个跟踪机器当前状态的变量。当收到事件时,回调必须决定是否使用事件并推进状态机,或者将它放入队列并等待机器处于不同的状态。

如果您想要更多详细信息或更准确的答案,您将不得不告诉我这些事件是什么以及触发它们的原因。