2017-10-15 1 views
3

비동기 자바 스크립트 함수를 작성했지만 기대했던 리턴 값을 얻지 못하는 것 같습니다. 비동기 함수가 작동하는 방식을 오해하고 있는지 또는 내 테스트가 올바르지 않은지 누군가가 설명 할 수 있습니까?비동기 비동기 테스트 JavaScript 함수 기다림

다음은 Nock을 사용하여 서비스를 조롱 한 나의 테스트입니다.

it('Should call async validation function when button is clicked',() => { 
    const request = nock(/.*/) 
     .get('/my-service/logincodes/abc123') 
     .reply(404); 

    const comp = mount(
     <LoginCodeView /> 
    ); 
    expect(comp.instance().doesLoginCodeExist('abc123')).to.equal('Your Login code is not recognized.'); 
}); 

그리고 테스트중인 기능 : 나는 코드가 소요가 예상대로 다른 경우 지점으로 갈 것으로 보인다 않는 경로 로그 아웃 한

doesLoginCodeExist = async (loginCode) => { 
    if (loginCode.match(loginPattern)) { 
     const response = await MyService.getUserByLoginCode(loginCode); 

     if (response.code) { 
     return {}; 
     } else if (response.status === 404) { 
     return { error: 'Your login code is not recognized.', success: null }; 
     } 
     return { error: 'Service is temporarily unavailable.', success: null }; 
    } 
    return null; 
    }; 

그러나 나는 항상 얻을 빈 객체 {}가 반환되었지만 예상대로 오류 및 성공 속성이있는 객체가 아닙니다.

+3

'async' 함수는 항상'Promise' 객체를 반환합니다. 나는 이것이 당신이 비어있는 물건을 부르는 것이라고 의심합니다. 테스트 함수 async를 만들고 거기에'await'을 사용해보십시오. –

+0

감사합니다 @ AlexanderO'Mara가 내 테스트 비동기 작업을 기다리고 있습니다. – deanmau5

답변

2

async 함수는 항상 Promise 개체를 반환합니다. 나는 이것이 당신이 비어있는 물건을 부르는 것이라고 의심합니다.

해결책으로 테스트 기능을 async으로 설정하고 await을 사용해보십시오. 그런 다음 약속이 해결할 가치를 테스트 할 수 있습니다.

2

내 테스트 비동기가 문제를 해결할 때까지 기다리는 중입니다.

it('Should call async validation function when button is clicked', async() => { 
    const request = nock(/.*/) 
     .get('/my-service/logincodes/abc123') 
     .reply(404); 

    const comp = mount(
     <LoginCodeView /> 
    ); 
    const returned = await comp.instance().doesLoginCodeExist('abc123') 
    expect(returned.error).to.equal('Your Login code is not recognized.'); 
});