私が何かを誤解していない限り、解決と拒否(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 は他の方法よりもはるかに読みやすくなります。私が現在使用している唯一のケースは、resolves
次rejects
のような単純なケースです。
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) は、テスト中に特定の数のアサーションが呼び出されたことを確認します。これは、コールバック内のアサーションが実際に呼び出されたことを確認するために、非同期コードをテストするときに役立ちます。
この行を一番上に置くことで、特定の番号テストが実行されるまでにアサーションが行われます。