Ошибка шутки с Typescript: тайм-аут — асинхронный обратный вызов не был вызван в течение времени ожидания 5000 мс, указанного jest.setTimeout.Тайм-аут

#node.js #typescript #jestjs #timeout

#node.js #typescript #jestjs #тайм-аут

Вопрос:

Я изучаю, как создавать некоторые тесты, используя Jest с Nodejs, на самом деле я использую typescript. Когда я пытаюсь запустить простой тест, проверяя статус ответа, он показывает следующую ошибку:

Обратный вызов Timeout — Async не был вызван в течение времени ожидания 5000 мс, указанного jest.setTimeout.Обратный вызов Timeout — Async не был вызван в течение времени ожидания 5000 мс, указанного jest.setTimeout.Ошибка:

Что я мог сделать?

Вот мои следующие коды:

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:

в моем SessionController.ts мне пришлось ввести следующее:

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

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

Я забыл отправить хаха

Ответ №2:

Первое, что нужно проверить, есть ли какая-либо ошибка в запросе или (что более вероятно), остается ли он в состоянии ожидания, потому что 5 секунд — это куча времени.

В любом случае вы можете указать время ожидания теста следующим образом

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

Комментарии:

1. я уже увеличил время ожидания до 30000, и я все еще получал ту же ошибку

2. Эй, я понял, как это решить, в моем SessionController.ts я не мог вернуть только статус ответа, мне пришлось вернуть также json….

Ответ №3:

Я не уверен, что вы действительно «завершаете» запрос, используя supertest API.

Подход supertest с плавным объединением в цепочки позволяет вам продолжать добавлять «шаги» к HTTP-запросу до его фактической отправки. К сожалению, send() готовит этап отправки для отправки. На самом деле он не отправляет, как вы можете видеть из этого примера суперагента, в котором многие дальнейшие шаги настройки следуют за send(), и только end() запускает их все.

В нескольких супертестовых примерах, которые я видел, есть связанный вызов ‘expect’, который, предположительно, также запускал бы фактическую HTTP-публикацию.

Аналогичным образом, документы ‘end()’ вhttps://github.com/visionmedia/supertest#endfn скажите…

Выполните запрос и вызовите fn (ошибка, повторный вызов)

Это указывает мне, что пока вы не отправите завершающий вызов, запроса не будет.

Комментарии:

1.Эй, я понял, как это решить, в моем SessionController.ts я не мог вернуть только статус ответа, мне пришлось вернуть также json….