4

我有一组基于全局事件发射器运行的模块。它们基于按时间顺序排列的事件链运行,如下所示:

  1. 启动准备就绪
  2. 服务器已创建(由于 boot.ready 事件)
  3. 服务器配置(因为 server.created 事件)

因此,我需要创建一个按时间顺序执行测试的 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. 这将触发server.created,之后配置器将运行,然后将触发server.configured

这一系列事件需要通过 mocha 进行测试。

4

2 回答 2

2

如果我正在测试一系列事件,那么快速的方法是嵌套 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()
  })
})

希望这可以帮助。

于 2012-05-11T15:57:05.360 回答
0

实际上 mocha 使用function.length你的it回调来知道你是否想要它们异步,所以function(done)你不知道它们以什么顺序运行。function()没有 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

});

此外,您应该知道在节点中发出是即时的,因此您最好在发出之前添加您的侦听器。

希望这很清楚。

于 2012-05-10T18:47:29.280 回答