2016-11-22 3 views
0

인턴을 통해 테스트해야하는 비동기 함수가 있습니다. 각각은 ES6 약속을 사용합니다.인턴 : ES6 약속으로 비동기 단위 테스트 테스트

Intern 문서에서 약속을 확인하는 즉시 약속을 반환하는 테스트 함수가 전달된다고 말합니다. 그러나 테스트중인 비동기 함수가 해결되었는지/거부되었는지 여부뿐만 아니라 해결 된 값이 올바른지 확인하고 싶습니다.

예 : 내 기능을 가지고 : 다음

function getSomething() { 
    return new Promise((resolve, reject) => { 
    // do some async stuff and resolve when done 
    setTimeout(function() { 
     resolve('the value');  
    }, 1000); 

    }); 
} 

나는 시험 방법이 :이 작동하지 않습니다 나타났습니다

tdd.test('getSomething', function() { 
    return new Promise((resolve, reject) => { 
    getSomething().then(function(value) { 
     // I want to resolve/reject the promise BASED ON the assertion -- if the assertion fails, I want to reject the promise; if it succeeds, I want to resolve it 
     assert.equal(value, 'the value', 'getSomething should return "the value".'); 
     resolve(); 
    }); 
    }); 
} 

를 - 주장은 내 테스트에 실패하는 경우 , resolve()는 결코 호출되지 않습니다.

어설 션을 조건으로 한 약속을 어떻게 해결할 수 있습니까? 시도/catch에서 어설 션을 래핑해야합니까? 나는 이것에 관한 인턴 문서에 대한 어떠한 문서도 보지 못했고 (대부분은 ES6 약속 대신 this.async()를 사용했다).

답변

3

코드에서 어떤 일이 발생하는지는 getSomething 콜백의 어설 션이 예외를 throw하고있어 resolve이 호출되지 않도록합니다. getSomething 약속은 거부되지만 래퍼 약속의 초기화 프로그램에서 반환하지 않으므로 래퍼 약속이 해결되거나 거부되지 않습니다.

새로운 약속으로 getSomething에 의해 반환 된 약속을 포장 할 필요는 없습니다. 그냥 직접 돌려 보내.

+0

그래서 테스트는 단지'''getSomething.then (function() {assert ('whatever')}))'''일까요? 이 경우 약속은 이미 그 시점에서 해결 되었기 때문에 주장이 호출 될 것인가? – Skitterm

+0

예 ('getSomething(). then' - 괄호를 잊지 마세요). assert는'getSomething()'약속이 해결 된 후에 호출됩니다. 왜냐하면 당신이 반환하는 것은 실제로 약속 체인이기 때문에,'then' 콜백 (그리고 따라서 어설 션)이 실행될 때까지 체인은 해결되지 않기 때문입니다. ('getSomething' 약속이 거부된다면 거부 할 수도 있지만 괜찮습니다.) – jason0x43