#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….