2012-05-10 5 views
4

전역 이벤트 이미 터를 기반으로 실행되는 모듈 세트가 있습니다.모카 테스트를 연대순으로 실행하는 방법?

  1. boot.ready
  2. 서버 구성 (때문에 server.created 이벤트) (때문에 boot.ready 이벤트의) 생성
  3. 서버 : 그들은 지금 같은 사건의 연대 체인을 기반으로 실행할

이와 같이, 테스트를 시간순으로 수행하는 server-test.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 후 생성됩니다 작품 터이 글로벌 이벤트 방법에 대한 몇 가지 혼란이있을 것 같았다 때문에

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 모듈입니다. 그러면 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

it 콜백에 사용하면 비동기 적으로 수신할지 여부를 알 수 있으므로 function(done)을 사용하면 실행 순서를 알 수 없습니다. 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

관련 문제