[英]How to run mocha tests in a chronological order?
我有一组基于全局事件发射器运行的模块。 它们根据事件的时间顺序运行,如下所示:
这样,我需要创建一个server-test.js,它按时间顺序执行测试。
摩卡咖啡有可能吗? 类似于以下内容?
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
,之后将运行配置程序,然后将触发server.configured
。
这一系列事件需要通过摩卡测试。
如果我正在测试一系列事件,则快速的方法是嵌套eventEmitter.once调用,如下所示:
it('executes in the right sequence', function(done) {
mediator.once('boot.ready', function() {
mediator.once('server.created', function() {
done()
})
})
})
编辑:如前所述,将在启动测试的boot.ready处理程序之前触发server.created。 解决方法:
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在您的it
回调中使用function.length
来知道您是否需要它们异步,因此使用function(done)
您无法知道它们以什么顺序运行。 没有完成参数的function()
将同步运行它们。
编辑
您的中介器是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在节点中是立即发送的,因此最好在发出前添加侦听器。
希望这很清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.