【问题标题】:How to run mocha tests in a chronological order?如何按时间顺序运行 mocha 测试?
【发布时间】:2012-05-19 09:28:23
【问题描述】:

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

  1. boot.ready
  2. 服务器已创建(由于 boot.ready 事件)
  3. 服务器已配置(因为 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来测试。

【问题讨论】:

    标签: javascript unit-testing node.js asynchronous mocha.js


    【解决方案1】:

    如果我正在测试一系列事件,那么快速的方法是嵌套 eventEmitter.once 调用,如下所示:

    it('executes in the right sequence', function(done) {
      mediator.once('boot.ready', function() {
        mediator.once('server.created', function() {
          done()
        })
      })
    })
    

    edit:正如所指出的 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()
      })
    })
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      实际上 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
      
      });
      

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

      希望这很清楚。

      【讨论】:

      • 如果没有 done 参数,我无法说明这个 it 测试何时完成。因此,这有什么帮助?
      • 我不认为你理解这个问题。服务器在boot.ready事件之后创建,服务器在server.created事件之后配置。这需要测试。您的示例代码没有做这样的事情。
      • 我已经更新了我原来的帖子,让你更清楚。
      • 哦,对不起,我有点累了。好吧,测试不会影响发送事件的顺序。问题是 mocha 可能不会立即运行嵌套的it,我猜它会将它存储在某种队列中。所以你应该创建两个独立的it,第一个你创建一个服务器,第二个你创建一个新的服务器然后配置它。
      • 尽管如此,这不会测试一个序列中的实际事件链。此外,它不会验证事件的顺序。
      猜你喜欢
      • 2015-11-24
      • 2012-04-01
      • 2016-07-17
      • 2015-12-21
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多