testing - Node 测试。如何避免竞争条件?

标签 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);
  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 评估。

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

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

最佳答案

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

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

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

关于testing - Node 测试。如何避免竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850305/

相关文章:

testing - 面向对白盒测试感兴趣的 QA 工程师的 JUnit 教程

javascript - 使用 ElasticSearch 连接查询

node.js - 如何防止 node.js 建立 future 的连接?

php - 使用来自同一行的 id 单击带有 XPath 的按钮

Angular 2 测试 : Async callback was not invoked within timeout specified by jasmine. DEFAULT_TIMEOUT_INTERVAL

javascript - 带有 Firefox Web 扩展插件的 Firebase 身份验证

javascript - 为什么 instanceof 对 babel-node 下的 Error 子类的实例不起作用?

c# - 可以在 API 上执行功能吗?

python - 简单的函数调用在 Robot Framework 中不起作用

iphone - 测试 Apple 推送通知反馈 - 未收到任何项目