带有 Typescript 错误的玩笑:超时 - 在 jest.setTimeout.Timeout 指定的 5000 毫秒超时内未调用异步回调

Posted

技术标签:

【中文标题】带有 Typescript 错误的玩笑:超时 - 在 jest.setTimeout.Timeout 指定的 5000 毫秒超时内未调用异步回调【英文标题】:Jest with Typescript error: Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Timeout 【发布时间】:2020-12-09 23:11:23 【问题描述】:

我正在研究如何使用 Jest 和 Nodejs 创建一些测试,我实际上是在使用 typescript。 当我尝试运行一个简单的测试时,通过检查响应的状态,它显示以下错误:

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

我能做什么?

这是我的以下代码:

session.test.ts =>

const request = require('supertest');
import app from '../../src/server';
describe('Authentication',() => 
    it('should authenticate with valid credentials',async() =>
        const response = await request(app)
        .post('/sessions')
        .send(
            email: "myemail@gmail.com",
            password: "123456"
        )

        await expect(response.status).toBe(200);
    );

);

SessionController.ts =>

import Request, Response from 'express';
export default class SessionController

async store(request: Request, response: Response)
        return response.status(200);
    
    
 

server.ts =>

import express from 'express'; 
import routes from './routes';
require("dotenv").config(
    path: process.env.NODE_ENV === "test" ? ".env.test" : ".env"
  );
  
const app = express();

app.use(express.json());
app.use(routes);
app.listen(3333);

export default app;

和 routes.ts:

import express from 'express';
import UsersController from './controllers/UsersController';
import SessionController from './controllers/SessionController';

const routes = express.Router();
const usersControllers = new UsersController();
const sessionController = new SessionController();

routes.post('/users',usersControllers.create);

routes.post('/sessions',sessionController.store);


export default routes;

【问题讨论】:

【参考方案1】:

首先要检查请求中是否有错误,或者(更有可能)它是否仍处于待处理状态,因为 5 秒是大量时间。

无论如何,您都可以指定测试超时,如下所示

describe('Authentication',() => 
  it('foobar', async function ()  // no arrow function
    this.timeout(10000)
    await myFunc()
  );
);

【讨论】:

我已经将超时时间增加到 30000,但我仍然遇到同样的错误 嘿,我想出了如何解决这个问题,在我的 SessionController.ts 中我不能只返回响应的状态,我还必须返回一个 json....【参考方案2】:

我不确定您是否真的使用超测 API 来“完成”请求。

supertest 的流畅链接方法允许您在实际调度 HTTP 请求之前继续添加“步骤”。不幸的是,send() 正在为您调度时准备一个发送步骤。正如您从this superagent example 中看到的那样,它实际上并没有调度,其中许多进一步的配置步骤遵循 send() 并且只有 end() 运行它们。

在几个超级测试示例中,我看到有一个链接的“期望”调用,它可能也会触发实际的 HTTP 发布。

同样,https://github.com/visionmedia/supertest#endfn 的“end()”文档说...

执行请求并调用 fn(err, res)

这向我表明,在您发送“终结”呼叫之前,不会有请求。

【讨论】:

嘿,我想出了如何解决这个问题,在我的 SessionController.ts 中我不能只返回响应的状态,我还必须返回一个 json....【参考方案3】:

在我的 SessionController.ts 中,我必须输入以下内容:

import Request, Response from 'express';
export default class SessionController

async store(request: Request, response: Response)
        return response.status(200).send()
    
    
 

忘记发了哈哈

【讨论】:

以上是关于带有 Typescript 错误的玩笑:超时 - 在 jest.setTimeout.Timeout 指定的 5000 毫秒超时内未调用异步回调的主要内容,如果未能解决你的问题,请参考以下文章

开玩笑测试通过但得到错误:最后连接 ECONNREFUSED 127.0.0.1:80

用 Quasar 和 Typescript 开玩笑

用 TypeScript 开玩笑:TypeError: environment.teardown 不是函数

如何允许 scss 开玩笑地对 typescript nextjs 进行单元测试?

Gitlab - 开玩笑测试 - 分段错误(核心转储)

赛普拉斯在开玩笑断言中导致类型错误