2017-10-25 11 views
0

mocha.js 테스트에서 async 함수를 호출하지만 테스트가 실패하지 않습니다. 그것은 통과하고 UnhandledPromiseRejectionWarning가 :내부 비동기 함수를 사용한 비동기 테스트가 실패합니다.

describe('async function', async function() { 
    it('should fail', async function() { 
     [1].forEach(async function() { 
      throw new Error("Why can't I see this error?!"); 
     }); 
    }); 
}); 

주 예상대로 간단한 경우가 작동하는지, :

describe('async function', async function() { 
    it('should fail', async function() { 
     throw new Error('This one fails the test'); 
    }); 
}); 

을 어떻게 실패 시험을 일으킬 수 인해 내부 함수에서 예외로 ?

(내가 unhandledRejection 핸들러를 추가하는 시도했지만, 테스트는 여전히 통과)

+0

확인 : https://stackoverflow.com/questions/14879181/test-for-expected-failure 다른 방법으로 대신 일반 for 루프를 내부 기능을 사용하지 않도록하고 사용할 수 있습니다 -in-mocha –

+2

@MihaiAndrici, 나는 질문과 코드를 간략하게하기 위해 그것을 언급하지 않았지만, 원래 코드에서는 실제로 '던져'는 아니지만 실패한 차이는 단언했다. 결과는 동일합니다 ('expect.fail()'은 테스트를 실패시키지 않습니다). 그러나 어쨌든 고마워. – GilZ

답변

3

당신이 일하고 싶은처럼 .forEach와 귀하의 테스트 케이스가 작동하지 않을 수 있습니다. 비동기 콜백을 호출하면 콜백은 약속을 생성하지만 .forEach은 아무 것도하지 않습니다. it에 전달한 콜백도 비동기이며 약속을 반환하지만 반환하는 약속은 .forEach에 대한 콜백이 생성하는 약속에 연결되지 않습니다. 그래서 UnhandledPromiseRejectionWarning이됩니다. 배열이 약속의 배열로 전환되도록 map를 사용

describe('async function', async function() { 
    it('should fail', async function() { 
     return Promise.all([1].map(async function() { 
      throw new Error("Why can't I see this error?!"); 
     })); 
    }); 
}); 

그것을 만들고, 배열의 모든 약속에 대한 다음 Promise.all 대기 :

당신은 Promise.all을 통해 약속을 연결하여 문제를 해결할 수 있습니다 어떤 약속이 거절 될지라도 그것을 거절한다. Promise.all 호출의 반환 값을 반환하면 모카가 모든 것을 기다릴 수 있습니다.

3

루이의 대답은 스포트 위에. 여기 실 밖으로

const data = [1]; 
for (let i = 0; i < data.length; i++) { 
    // await some more stuff here 
    throw new Error('This one fails the test'); 
}