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

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

  • 准备好了吗
  • 已创建服务器(由于boot.ready事件)
  • 已配置服务器(由于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


    这个事件链需要由摩卡进行测试。

    实际上,摩卡使用
    函数。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
    ,第一个是创建一个服务器,第二个是创建一个新服务器,然后对其进行配置。但这不会在一个序列中测试实际的事件链。此外,它不会验证事件的顺序。