我有一组基于全局事件发射器运行的模块。它们基于按时间顺序排列的事件链运行,如下所示:
- boot.ready
- 服务器创建(因为 boot.ready 事件)
- 服务器已配置(由于 server.created 事件)
因此,我需要创建一个按时间顺序执行测试的 server-test.js。
Mocha 可以做到这一点吗?像下面这样的东西?
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
。
这一系列事件需要通过 mocha 进行测试。
最佳答案
如果我正在测试一系列事件,那么快速的方法是嵌套 eventEmitter.once 调用,如下所示:
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()
})
})
希望这对您有所帮助。
关于javascript - 如何按时间顺序运行 Mocha 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10540254/