2017-10-15 36 views
3

私は非同期JavaScript関数を書いていますが、私が期待する戻り値を得ていないようです。私は、非同期関数がどのように機能するのかを誤解しているのか、それとも私のテストが間違っているのか、誰かが説明できますか?非同期非同期テスト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.'); 
}); 
関連する問題