2012-05-10 3 views
4

У меня есть набор модулей, которые запускаются на основе глобального эмиттера событий. Они бегут на основе хронологической цепочки событий, например, так:Как выполнить тесты мокки в хронологическом порядке?

  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.

Эта цепочка событий должна быть проверена мокко.

ответ

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() 
    }) 
}) 

Надеюсь, что это поможет.

+0

Трюк, но это сделало бы это ... – Tom

0

Фактически мокко использовать function.length для ваших it обратных вызовов, чтобы узнать, хотите ли вы их асинхронно, поэтому с function(done) вы не можете узнать, в каком порядке они запускаются. function() без аргумента будет запускать их синхронно.

EDIT

Ваш посредник является 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 

}); 

Кроме того, вы должны знать, что испускает немедленно в узле, так что вы бы лучше добавить свои слушатель перед испусканием.

Надеюсь, это ясно.

+0

Если аргумент не выполнен, я не могу указать, когда этот тест 'it' завершился. Как это, как это помогает? – Tom

+0

Извините, я должен был ответить на него. Я уточню свой ответ. – kevin

+0

Я не думаю, что вы понимаете проблему. Сервер создается после события 'boot.ready', а сервер настроен после события' server.created'.Это необходимо проверить. Ваш примерный код не делает ничего подобного. – Tom

Смежные вопросы