Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing Nodejs测试。如何避免比赛条件?_Testing_Node.js - Fatal编程技术网

Testing Nodejs测试。如何避免比赛条件?

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

我目前正在用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评估的状态

我尝试在状态之间注入延迟时间,但是,这在我的代码库中引入了额外的竞争条件错误


有人能告诉我解决这个问题的更好方法吗

很难用这样抽象的方式来讨论这个问题,但在我看来,你所谓的状态并不是真正的状态,而是异步事件。这些事件中的每一个都可能改变状态机的内部状态,但这取决于接收事件的顺序。我不确定事件B的唯一触发器是否是事件A,但我假设不是。(如果是,那么为什么要将事件拆分为单独的事件A、B和C?似乎是武断和毫无意义的,为什么不依次调用每个回调?)

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

如果你想要更详细的信息,或者更准确的答案,你必须告诉我这些事件是什么,以及是什么触发了它们