Testing Nodejs测试。如何避免比赛条件?
我目前正在用nodejs编写一个游戏引擎 我的游戏有几个状态。让我们叫他们StateA,StateB,StateC。序列流是StateA=>StateB=>StateC 我想在每个状态结束时测试发动机的状态。我目前有以下结构:Testing Nodejs测试。如何避免比赛条件?,testing,node.js,Testing,Node.js,我目前正在用nodejs编写一个游戏引擎 我的游戏有几个状态。让我们叫他们StateA,StateB,StateC。序列流是StateA=>StateB=>StateC 我想在每个状态结束时测试发动机的状态。我目前有以下结构: function attachEventListeners = function(instance) { instance.on('START_STATE_A', stateA); instance.on('START_STATE_B', stateB); i
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评估的状态
我尝试在状态之间注入延迟时间,但是,这在我的代码库中引入了额外的竞争条件错误
有人能告诉我解决这个问题的更好方法吗 很难用这样抽象的方式来讨论这个问题,但在我看来,你所谓的状态并不是真正的状态,而是异步事件。这些事件中的每一个都可能改变状态机的内部状态,但这取决于接收事件的顺序。我不确定事件B的唯一触发器是否是事件A,但我假设不是。(如果是,那么为什么要将事件拆分为单独的事件A、B和C?似乎是武断和毫无意义的,为什么不依次调用每个回调?) 因此,为了实现状态机,您需要一个变量来跟踪机器当前的状态。当接收到事件时,回调必须决定是使用事件并推进状态机,还是将其放入队列并等待,直到机器处于不同的状态 如果你想要更详细的信息,或者更准确的答案,你必须告诉我这些事件是什么,以及是什么触发了它们