如何以时间顺序运行摩卡testing?

我有一套基于全局事件发射器运行的模块。 他们按照时间顺序的事件运行,如下所示:

  1. boot.ready
  2. 服务器创build(因为boot.ready事件)
  3. 服务器configuration(由于server.created事件)

因此,我需要创build一个server-test.js按照时间顺序执行testing。

摩卡这可能吗? 像下面的东西?

var EventEmitter2 = require('eventemitter2').EventEmitter2, should = require('should'); describe('server', function() { var mediator = new EventEmitter2({ wildcard: false }); require('../../src/routines/server/creator')(mediator); require('../../src/routines/server/configurer')(mediator); it('should be created after boot', function(done) { mediator.once('server.created', function(server) { server.should.exist; done(); }); it('should be configured after created', function(done) { mediator.once('server.configured', function() { done(); }); }); mediator.emit('boot.ready'); }); }); 

因为这个全局事件发射器的工作方式似乎有些混乱,所以这是server/creator.js模块:

 module.exports = function(mediator) { var express = require('express'); mediator.once('boot.ready', function() { var server = express.createServer(); //event: server created mediator.emit('server.created', server); }); }; 

正如你所看到的,服务器是在boot.ready之后boot.ready 。 这将触发server.created ,然后configuration器将运行,然后将启动server.configured

这一系列事件需要摩卡testing。

如果我正在testing一连串的事件,快速的方法是嵌套eventEmitter.once这样调用:

 it('executes in the right sequence', function(done) { mediator.once('boot.ready', function() { mediator.once('server.created', function() { done() }) }) }) 

编辑:如指出server.created将被激发之前testing的boot.ready处理程序被触发。 这是一个解决方法:

 it('executes in the right sequence', function(done) { var bootReadyFired = false mediator.once('boot.ready', function() { bootReadyFired = true }) mediator.once('server.created', function() { assert.ok(bootReadyFired) done() }) }) 

希望这可以帮助。

实际上,mocha使用function.length来调用你的callbackfunction.length来知道你是否需要它们,所以function(done)你不知道它们以什么顺序运行。 function()没有完成参数将同步运行它们。

编辑

你的介体是一个EventEmitter2,这意味着当你发射一些东西的时候,这个处理器将会运行asynchronous。 就像我说的,他们无法知道执行的顺序。

问题出在你需要的模块上,每个事件都应该放在前面的处理程序中。 代码比单词好:

 // require('../../src/routines/server/creator')(mediator); // I guess this module creates the server, then it should emit server.created // require('../../src/routines/server/configurer')(mediator) // This one should listen to server.created then configure the server // and finally emit server.configured // So in it you should have something like this: mediator.once('server.created', function(server) { // Here you should configure you're server // Once it is configured then you emit server.configured }); 

你也应该知道节点中的发射是立即的,所以你最好在发射之前添加你的监听器。

希望这是明确的。