2014-05-01 2 views
1

일부 비동기 작업을 수행하는 라이브러리 (pouchDB)를 사용하고 있습니다. 일을 간단하게 유지하기 위해 비동기 작업과 관련된 "단위 테스트"(단위 테스트는 따옴표로 묶는 것이 일반적으로 문제라고 생각합니다. 하지만 다른 라이브러리를 사용하면 QUnit을 사용하는 것이 테스트를 작성하는 가장 적절한 방법입니다.비동기식 설정 및 해체 작업이있는 테스트를 작성하려면 어떻게해야합니까?

내 js 단위 테스트를 수행하기 위해 QUnit을 사용하고 있습니다. 두 가지 테스트가 있습니다. 나는 둘 중 하나를 실행하면 (다른 주석을 가지고있는 동안) 통과 할 것이라는 것을 안다. 두 항목을 함께 실행하면 두 번째 실행이 실패합니다. 두 번째 것이 완료되기 전에 셋업을 중지시키는 첫 번째 완료에 대한 분해 (teardown)가 완료되기 전에 두 번째 것이 실행중인 것처럼 보입니다.

module("pouchDB integration specs", { 

    setup: function(){ 

    //some setup stuff 
    } 

    }, 

    teardown: function(){ 

    //some teardown stuff  
    }); 

    } 

}); 

asyncTest("test1", 1, function(){ 

test1MethodBeingTested(); 

document.addEventListener("completedTest1Stuff", function(){ 

     deepEqual(newFriendSchedule, 'new', "Test 1 Looks Good'"); 
     start(); 

    }); 

    }); 


}); 

asyncTest("test2", 2, function(){ 

    stuffBeingTestedForTest2(); 

    document.addEventListener("test 2 stuff done", function(){ 

    deepEqual(expectedTest2Result, actualTest1Result, "test 2 looks good!"); 
    start();  

    }) 

}); 

내가 Martin Fowler's take on testing asynchronous code에 모습을 가지고 있지만이 있었다에서 내 테이크 아웃 "당신이 설계해야

(사과는 들여 쓰기 쓰레기에 대한. SO의 편집자는 상관없이 내가 씨름 얼마나 날 좋아하지 않습니다) 본질적으로 비동기가 아니도록 코드를 작성하십시오. " 내가 수정하고 싶지 않은 라이브러리와의 통합을 테스트하고 있기 때문에 어떤 도움이되지 못합니까? (이전에이 문제를 다루어서는 안됩니다.)

+0

하여 정리 방법은 비동기입니다 가능성은? QUnit을로드하기 위해 require를 사용할 때도이 문제를 보았습니다. – psquared

+0

@psquared 예, 내 정리 (일명 teardown) 방법이 비동기입니다. 나는 그것을 명확하게하기 위해 질문을 갱신 할 것이다. 이 문제를 해결할 방법을 찾았습니까? – JoeyC

답변

1

테스트 방법과 유사합니다. , 정리 코드가 완료 될 때까지 시험 실행 코드를 stopstart으로 사용할 수 있습니다 (asyncTest은 암시 적으로 stop을 호출 함). QUnit은 stop/start 호출에 카운팅 세마포를 사용하므로 두 개 이상의 비동기 작업이있는 경우 stop 번을 여러 번 호출 할 수 있습니다.

빠른 예 :

var teardownDone = false; 
var tests = 0; 

var testContent = function() { 
    if (tests > 0) { 
     QUnit.ok(teardownDone); 
    } else { 
     QUnit.ok(true); 
     tests++; 
    } 
}; 

module('example', { 
    teardown: function() { 
     // Without this call and the subsequent start(), tests will fail. 
     stop(); 
     setTimeout(function() { 
      teardownDone = true; 
      start(); 
     }, 1000); 
    } 
}); 

test('test1', testContent); 
test('test2', testContent); 

JSFiddle

+0

이것은 ** 정확히 ** 내가 원했던 것입니다! 무리 감사! – JoeyC