超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调
Posted
技术标签:
【中文标题】超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调【英文标题】:Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout 【发布时间】:2019-03-11 20:17:27 【问题描述】:我正在使用 jest 测试用户功能(注册和登录)的 API。
测试代码:
const request = require('supertest');
const app = require('../../app');
describe('Test User Functionality', () =>
test('User should be able to login', async done =>
const response = await request(app)
.post('/api/users/login')
.send(
email: 'test@test.com',
password: 'welcome1',
)
.expect(200);
done();
//expect(response.statusCode).toBe(200);
);
test('User should be able to signup', async done =>
const response = await request(app)
.post('/api/users/signup')
.send(
username: 'testuser',
email: 'test@test1.com',
password: 'welcome1',
)
.expect(200);
done();
//expect(response.statusCode).toBe(200);
);
);
如果我有单个测试,它工作正常,但里面有多个测试描述,它显示超时错误。
以下是错误截图:
我尝试添加超时,交换测试但仍然没有成功。
请大家帮忙!
【问题讨论】:
你解决过这个问题吗? 【参考方案1】:我在使用异步请求测试我的反应组件时遇到了同样的问题。
发生这种情况是因为您没有正确完成请求。
你可以轻松解决这个问题。
选项 1:移动 done
作为 expect
函数调用的第二个参数,如下所示。
const response = await request(app)
.post('/api/users/signup')
.send(
username: 'testuser',
email: 'test@test1.com',
password: 'welcome1',
)
.expect(200, done);
选项2:使用end
方法
const response = await request(app)
.post('/api/users/signup')
.send(
username: 'testuser',
email: 'test@test1.com',
password: 'welcome1',
)
.expect(200)
.end((err, res) =>
// do anything you want!
)
或者你可以签出文档(https://github.com/visionmedia/supertest#readme)!
【讨论】:
【参考方案2】:一个可能的问题可能与 express 中间件有关。 要确定您是否属于这种情况,您可以:
-
注释掉你的 express 应用的所有中间件 (
app.use(/* middleware */)
docs)
查看测试是否开始以某种方式进行(通过/不超时)
开始取消对中间件的注释,将其缩小到罪魁祸首。
一旦您找到了超时的原因,您就可以更深入地研究。 模拟导致问题的中间件的不同部分:
-
通过在目录中创建
__mocks__
来模拟第三方库
你的根目录并插入一个文件library_name.js
(这是
手动嘲讽:
documentation)
模拟中间件并直接通过它们,只需调用 next app.use(Your.Middleware)
并在中间件文件中即可
/** Possibly imports and some setup here */
// Make sure the function being called is mocked
export default
Middleware: (req, res, next) =>
next();
,
(包含中间件的文件可能包含一些可能导致问题的附加设置。)
我的特殊情况:
我在中间件和 Redis 实例化的文件中使用 ioredis
,它尝试多次连接到存储,导致超时。
事实证明,主机名是错误的。解决这个问题的关键是模拟中间件并找到额外的设置。然后 Jest 显示另一个错误提示商店连接问题。
【讨论】:
以上是关于超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调的主要内容,如果未能解决你的问题,请参考以下文章
超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调
JEST:“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。”,尽管它已经配置
带有 Typescript 错误的玩笑:超时 - 在 jest.setTimeout.Timeout 指定的 5000 毫秒超时内未调用异步回调
Got Timeout - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调