Jest with Typescript error: Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Timeout

Jest with Typescript error: Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Timeout

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

Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Error:

我能做什么?

这是我的以下代码:

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;

第一件事是检查请求中是否有错误,或者(更有可能)是否仍处于挂起状态,因为 5 秒是很多时间。

无论如何你可以像下面那样指定测试超时

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

我不确定你是否真的'completing'请求使用超级测试API。

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

在几个超级测试示例中,我看到有一个链式 'expect' 调用,它可能还会触发实际的 HTTP post。

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

Perform the request and invoke fn(err, res)

这向我表明,在您发送 'finalising' 调用之前,不会有请求。

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

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

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

忘记发了哈哈