Javascript 如何按时间顺序运行mocha测试?
我有一组基于全局事件发射器运行的模块。它们基于事件的时间链运行,如下所示:Javascript 如何按时间顺序运行mocha测试?,javascript,unit-testing,node.js,asynchronous,mocha.js,Javascript,Unit Testing,Node.js,Asynchronous,Mocha.js,我有一组基于全局事件发射器运行的模块。它们基于事件的时间链运行,如下所示: 准备好了吗 已创建服务器(由于boot.ready事件) 已配置服务器(由于server.created事件) 因此,我需要创建一个server-test.js,它按时间顺序执行测试 摩卡咖啡可以吗?像下面这样的 var EventEmitter2 = require('eventemitter2').EventEmitter2, should = require('should
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
之后创建的。这将触发server.created
,之后配置程序将运行,然后将触发server.configured
这个事件链需要由摩卡进行测试。实际上,摩卡使用
函数。length
调用您的it
以了解您是否希望它们异步运行,因此使用函数(完成)
您无法知道它们的运行顺序function()
without done参数将同步运行它们
编辑
您的中介是EventEmitter2,这意味着当您发出某些内容时,处理程序将异步运行。就像我说的,他们无法知道执行命令的顺序
问题在于您需要的模块中,每个事件可能都应该在前一个模块的处理程序中发出。代码胜过文字:
// 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
});
您还应该知道,在节点中,emit是即时的,所以最好在发出之前添加侦听器
希望这是清楚的。如果我正在测试一系列事件,那么快速的方法就是使用嵌套的eventEmitter。一次调用如下:
it('executes in the right sequence', function(done) {
mediator.once('boot.ready', function() {
mediator.once('server.created', function() {
done()
})
})
})
编辑:正如所指出的,server.created将在启动测试的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()
})
})
希望这有帮助。如果没有“完成”参数,我无法说明此测试何时完成。因此,这有什么帮助?我认为你不理解这个问题。服务器是在
boot.ready
事件之后创建的,服务器是在server.created
事件之后配置的。这需要测试。你的示例代码没有做任何类似的事情。我已经更新了我原来的帖子,让你更清楚。哦,对不起,我有点累了。测试不会影响事件的发送顺序。问题是mocha可能不会立即运行嵌套的it
,我想它会将其存储在某种队列中。因此,您应该创建两个独立的it
,第一个是创建一个服务器,第二个是创建一个新服务器,然后对其进行配置。但这不会在一个序列中测试实际的事件链。此外,它不会验证事件的顺序。