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

Posted

技术标签:

【中文标题】使用 Node 进行 Jest 测试 - 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调【英文标题】:Jest testing with Node - Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout 【发布时间】:2019-04-23 04:10:52 【问题描述】:

我开始使用 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 说

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

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

【问题讨论】:

【参考方案1】:

您可以使用resolves 获得异步结果,如shown in the Jest documentation。

在你的情况下:

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
        )
    

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

此外,如果您只是想增加超时时间,那么您可以通过设置来做到这一点

 jest.setTimeout(10000);

如果您想更改该描述块中所有测试的超时时间,可以在 beforeEach 中使用此语句,如果您希望单个测试使用它,则可以在 test/it/spec 块中使用此语句。

【讨论】:

以上是关于使用 Node 进行 Jest 测试 - 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调的主要内容,如果未能解决你的问题,请参考以下文章

Supertest 在 Node 中进行 Jest 测试时出现 MaxListenersExceedingWarning 错误

Jest - 模拟和测试 node.js 文件系统

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

使用 Jest 和 Webpack 别名进行测试

VSCode 新手:通过 Docker 进行远程 Jest/Node 调试

在 VSTS 中,连接到 dockerized ArangoDB 数据库的异步 Jest 测试超时