使用 Node 进行 Jest 测试 - 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

新手上路,请多包涵

我开始用Jest测试我的代码,我做一个看似简单的测试都无法通过。我只是想检查我从 Maogose 数据库请求中收到的是否是一个对象。

函数 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 说

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。

问题:我怎样才能通过这个测试?

原文由 mokiliii Lo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
2 个回答

您可以使用 resolves 获得异步结果,如 Jest 文档中所示

在你的情况下:

 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));
})

另一个提示:您不需要在额外的承诺中包装 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
        })
    }
}

原文由 Patrick Hund 发布,翻译遵循 CC BY-SA 4.0 许可协议

您也很有可能根本没有从测试套件中获得来自数据库的响应。测试套件可以调用导致不同调用的不同环境变量/配置。如果没有返回响应,也可以看到此错误,例如 - 如果有人阻止您的 IP 连接,不断。

原文由 typo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题