web-dev-qa-db-ja.com

Node-タイムアウトを使用したJestテスト-タイムアウト-非同期コールバックは、jest.setTimeoutで指定された5000ミリ秒のタイムアウト時間内に呼び出されませんでした

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のタイムアウト時間内に非同期コールバックが呼び出されませんでした。'

質問:このテストに合格するにはどうすればよいですか?

4
mokiliii Lo

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
        })
    }
}
5
Patrick Hund

また、単にタイムアウトを増やすことを考えている場合は、次のように設定してそれを行うことができます

 jest.setTimeout(10000);

その記述ブロック内のすべてのテストのタイムアウトを変更する場合はbeforeEachで、このステートメントを使用できます。単一のテストで使用する場合はtest/it/specブロックで使用できます。

1
shmit

また、テストスイートからDBからの応答がまったく返されない可能性も高くなります。テストスイートは、さまざまな呼び出しにつながるさまざまな環境変数/構成を呼び出すことができます。このエラーは、次のように応答が返されない場合にも発生する可能性があります-誰かがあなたのIPの接続を何度もブロックした場合。

0
typo