2012-03-16 4 views
42

이 질문은 NodeJS에 대한 모카 테스트 프레임 워크와 관련이 있습니다.Async Mocha 테스트 (NodeJS)를 순서대로 실행하려면 어떻게해야합니까?

기본 동작은 모든 테스트를 시작 그들이에서 와서 비동기 콜백을 처리 할 것으로 보인다.

비동기 테스트를 실행할 때, 나는의 비동기 부분 후 각 테스트 를 실행하고 싶습니다 하나는 이전에 호출되었습니다.

어떻게하면됩니까?

답변

30

"구조화 된 코드가 구조화 된 순서대로 실행됩니다"(놀라워요!) - @chrisdew 에서처럼 비동기 테스트의 반환 순서는 보장 할 수 없습니다. 문제를 다시 말하면 (동기 실행) 체인 아래쪽에있는 테스트에서는이 비동기 테스트로 설정된 필수 조건을 실행할 때까지 준비 할 수 있음을 보장 할 수 없습니다.

첫 번째 테스트 (로그인 토큰 등)에서 특정 조건을 설정해야하는 경우 진행하기 전에 테스트 조건이 설정되어있는 before()과 같은 후크를 사용해야합니다. 블록에서

랩 종속 테스트 및 그들에 비동기before 후크 실행 (알을 전과 블록에 '다') :

var someCondition = false 

// ... your Async tests setting conditions go up here... 

describe('is dependent on someCondition', function(){ 

    // Polls `someCondition` every 1s 
    var check = function(done) { 
    if (someCondition) done(); 
    else setTimeout(function(){ check(done) }, 1000); 
    } 

    before(function(done){ 
    check(done); 
    }); 

    it('should get here ONLY once someCondition is true', function(){ 
    // Only gets here once `someCondition` is satisfied 
    }); 

}) 
+0

before 콜백이 while 루프에 잠겨 있다면'someCondition'은 어떻게 변할 것입니까? 이것은 JavaScript가 작동하는 방식이 아닙니다. – natevw

+0

질문에 대한 답은 주석 행 3에 있습니다. ".. 비동기 테스트 설정 조건이 여기에 있습니다." 구체적으로는 : 비동기, 설정 조건.'before()'전에 인스턴스화되는'describe()'밖에서 범위가 지정됩니다. 이 방법으로 작동하지 않는 자바에 대한 후자의 주장은 거짓입니다. – papercowboy

+0

! someCondition을 반복해서 확인하면서 코드가 반복적으로 멈추는 동안 다른 코드는 실행될 수 없습니다. (이벤트/타이머와 관련된 다른 모든 콜백은 실행되지 않습니다.) 이것이 작동하는 유일한 방법은 루프가 시작되기 전에 someCondition이 true로 설정된 경우입니다. 그렇지 않으면 중단됩니다. 시도 해봐. – natevw

7

내가 사용하는대로 작성한 것에 놀랐습니다. 나는 bdd 스타일 테스트 (설명/그것)와 함께 모카를 사용하고, 단지 내 console.logs를 내 테스트에 추가하여 당신의 주장이 내 경우를 견디지 ​​만 겉으로보기에는 그렇지 않은지 확인합니다.

다음은 "end1"및 "start1"의 순서를 보았을 때 사용한 코드 조각입니다. 그들은 제대로 주문되었습니다. 물론

describe('Characters start a work', function(){ 
    before(function(){ 
     sinon.stub(statusapp, 'create_message'); 
    }); 
    after(function(){ 
     statusapp.create_message.restore(); 
    }); 
    it('creates the events and sends out a message', function(done){ 
     draftwork.start_job(function(err, work){ 
     statusapp.create_message.callCount.should.equal(1); 
     draftwork.get('events').length.should.equal(
      statusapp.module('jobs').Jobs.get(draftwork.get('job_id')).get('nbr_events') 
     ); 
     console.log('end1'); 
     done(); 
     }); 
    }); 
    it('triggers work:start event', function(done){ 
     console.log('start2'); 
     statusapp.app.bind('work:start', function(work){ 
     work.id.should.equal(draftwork.id); 
     statusapp.app.off('work:start'); 
     done(); 
     }); 

이 너무 사고가 일어날 수있는,하지만 난 시험의 많음이있다, 그들은 병렬로 실행한다면, 나는 확실히 내가하지 않아도, 경쟁 조건을 가지고있다.

mocha 발행 추적기의 this issue도 참조하십시오. 그것에 따르면, 테스트는 동 기적으로 실행됩니다.

+0

이것은 주문 된 코드가 순서대로 실행됨을 나타냅니다. 우연히 그런 일은 일어나지 않습니다. 그것이 "작동 방식"입니다. – papercowboy

+0

정렬 된 비동기 테스트가 순서대로 실행됨을 보여줍니다. 'end1'은 항상 'start2'전에 발생합니다. 이 예제를 단순화하기 위해 첫 번째 테스트의 내용을'setTimeout (done, 1000)'으로 대체 할 수있다.그리고'before' hook을 비동기 hook로 바꾸면 첫 번째 테스트 전에 항상 실행됩니다. 제가 이해하는 바와 같이, 이것은 주제 시동기가 관심을 가졌던 행동과 동일합니다. 그리고이 행동은 적어도 현재는 기본이고 유일한 행동입니다. – skozin

5

나는 우리의 응용 프로그램이 같은 문제를 해결하기 위해 원 그러나 accepted answer은 우리에게 잘 작동하지 않았습니다. 특히 someCondition에서 결코 사실이 아닐 수 있습니다.

우리는 우리의 어플리케이션에서 약속을 사용하고 이에 따라 테스트를 구조화하는 것이 매우 쉬워졌습니다. 열쇠는 그러나 before 후크를 통해 실행을 지연 여전히 :

var assert = require("assert"); 

describe("Application", function() { 
    var application = require(__dirname + "/../app.js"); 
    var bootPromise = application.boot(); 

    describe("#boot()", function() { 
    it("should start without errors", function() { 
     return bootPromise; 
    }); 
    }); 

    describe("#shutdown()", function() { 
    before(function() { 
     return bootPromise; 
    }); 

    it("should be able to shut down cleanly", function() { 
     return application.shutdown(); 
    }); 
    }); 
}); 
+3

최상위 스위트 ("Application")에서 비동기'before' 블록 안에 두 번째와 세 번째 코드 행 ('application = ...'및'bootPromise = ...')을 넣는 것이 좋습니다. 그렇지 않으면,이 코드에서 던져진 어떤 예외도 잡히지 않고 제대로보고되지 않으며, 더 나쁜 경우, 나머지 모든 테스트의 실행을 막을 것입니다. – skozin

4

사용 mocha-steps

그들이 (그들이했던 것처럼 즉 당신의 done 기능은 아직 정확하게 작동) 비동기 또는하지 않은 경우에 관계없이 테스트 순차적를 유지합니다. it을 직접 대신 사용합니다. step

+0

왜이 다운이 투표 되었습니까? –

+1

@JackMurphy 좋은 질문입니다. – WiR3D

+0

동일. 나는 똑같은 문제가 있었는데 이것이 나를 도왔다. – hrishioa

관련 문제