JestでPromiseをテストする最良の方法 質問する

JestでPromiseをテストする最良の方法 質問する

私が何かを誤解していない限り、解決と拒否(https://facebook.github.io/jest/docs/expect.html#resolves) は vNext まで利用できません。現時点で、または当面の間、Jest で promise をテストするための推奨される方法は何ですか? then と catch に expect を入れるだけですか?

例えば:

describe('Fetching', () => {
    const filters = {
        startDate: '2015-09-01'
    };
    const api = new TestApiTransport();

    it('should reject if no startdate is given', () => {
        MyService.fetch().catch(e => expect(e).toBeTruthy()); // see rejects/resolves in v20+
    });            

    it('should return expected data', () => {
        MyService.fetch(filters, null, api).then(serviceObjects => {
            expect(serviceObjects).toHaveLength(2);
        }).catch(e => console.log(e));
    });            
});

2019年6月15日更新: この質問を投稿してから間もなく、Jest はこれをすぐにサポートし始めました。私は、これを実行するための現時点での最良の方法を反映するように、以下の承認済みの回答を変更しました。

2021年12月8日更新: ある時点で Jest は async/await のサポートを開始しました。そのため、他の方法が機能するとわかりましたが、私は (ほとんどの場合) 次のような単純な方法を使用するようになりました。

it('should do something', async () => {
    const expected = true; 
    expect(await funcToTest()).toEqual(expected);
});

ほとんどの場合と同様に、async/await は他の方法よりもはるかに読みやすくなります。私が現在使用している唯一のケースは、resolvesrejectsのような単純なケースです。

it('should not throw when doing something', async () => {
    await expect(funcToTest()).resolves.not.toThrow();
});

it('should throw when something is wrong', async () => {
    await expect(funcToTest()).rejects.toThrow();
});

ベストアンサー1

最近ではこのように書くこともできます:ドキュメント

describe('Fetching', () => {
    const filters = {
        startDate: '2015-09-01'
    };
    const api = new TestApiTransport(); 

 it('should reject if no startdate is given', () => {
   expect.assertions(1);
   return expect(MyService.fetch()).rejects.toEqual({
     error: 'Your code message',
   });
 });          


 it('should return expected data', () => {
   expect.assertions(1);
   return expect(MyService.fetch(filters, null, api)).resolves.toEqual(extectedObjectFromApi);
 });            
});

更新 (2019年6月1日)

expect.assertions(1);受け入れられた回答は、すべての魔法を行なった行であるため、正しく機能しないことに同意します。ドキュメントへのリンク

expect.assertions(number) は、テスト中に特定の数のアサーションが呼び出されたことを確認します。これは、コールバック内のアサーションが実際に呼び出されたことを確認するために、非同期コードをテストするときに役立ちます。

この行を一番上に置くことで、特定の番号テストが実行されるまでにアサーションが行われます。

おすすめ記事