2012-05-10 42 views
4

我有一套基於全局事件發射器運行的模塊。它們運行基於事件的時間鏈,就像這樣:如何按時間順序運行摩卡測試?

  1. boot.ready創建
  2. 服務器配置(因爲server.created事件)
  3. (因爲boot.ready事件)
  4. 服務器

因此,我需要創建一個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()將同步運行它們。

編輯

你的調解人是一個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是立即的,因此您最好在發出之前添加偵聽器。

希望這是明確的。

+0

如果沒有完成的參數,我不能說明這個「it」測試何時完成。因此,這有何幫助? – Tom

+0

對不起,我應該回答。我會更新我的答案。 – kevin

+0

我不認爲你明白這個問題。服務器在'boot.ready'事件之後創建,服務器在'server.created'事件之後配置。這需要測試。你的示例代碼不會做這樣的事情。 – Tom

相關問題