Jestを使用してコードのテストを開始しましたが、一見単純なテストに合格できません。 Maogooseデータベースリクエストから受け取ったものがオブジェクトであるかどうかを確認しようとしています。
関数fetchPosts()
は、Reactフロントエンドで接続し、データを正しく表示しているため、機能しています。
これは私の関数ですfetchPosts()
:
module.exports = {
fetchPosts() {
return new Promise((resolve, reject) => {
Posts.find({}).then(posts => {
if (posts) {
resolve(posts)
} else {
reject()
}
})
})
}
}
そして私のテスト:
it('should get a list of posts', function() {
return posts.fetchPosts().then(result => {
expect(typeof result).toBe('object')
})
})
これはテストを失敗させます、そしてジェストは言います
'タイムアウト-jest.setTimeoutで指定された5000msのタイムアウト時間内に非同期コールバックが呼び出されませんでした。'
質問:このテストに合格するにはどうすればよいですか?
Jestのドキュメントに記載 のように、resolves
を使用して非同期の結果を期待できます。
あなたの場合:
it('should get a list of posts', function() {
const result = posts.fetchPosts();
expect(result).resolves.toEqual(expect.any(Object));
})
…私は疑いがありますが、あなたの投稿のリストは実際には配列なので、おそらくこれが必要です:
it('should get a list of posts', function() {
const result = posts.fetchPosts();
expect(result).resolves.toEqual(expect.any(Array));
})
もう1つのヒント:fetchPost
の本文を追加のプロミスでラップする必要はありません。Posts.find
から取得したプロミスを返して、then
を追加するだけです。 、 このような:
module.exports = {
fetchPosts() {
return Posts.find({}).then(posts => {
if (posts) {
return posts;
}
throw new Error('no posts'); // this will cause a promise rejection
})
}
}
また、単にタイムアウトを増やすことを考えている場合は、次のように設定してそれを行うことができます
jest.setTimeout(10000);
その記述ブロック内のすべてのテストのタイムアウトを変更する場合はbeforeEachで、このステートメントを使用できます。単一のテストで使用する場合はtest/it/specブロックで使用できます。
また、テストスイートからDBからの応答がまったく返されない可能性も高くなります。テストスイートは、さまざまな呼び出しにつながるさまざまな環境変数/構成を呼び出すことができます。このエラーは、次のように応答が返されない場合にも発生する可能性があります-誰かがあなたのIPの接続を何度もブロックした場合。