如何以时间顺序运行摩卡testing?
我有一套基于全局事件发射器运行的模块。 他们按照时间顺序的事件运行,如下所示:
- boot.ready
- 服务器创build(因为boot.ready事件)
- 服务器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 });
你也应该知道节点中的发射是立即的,所以你最好在发射之前添加你的监听器。
希望这是明确的。