jest асинхронный тест, игнорирующий функцию ожидаем () - PullRequest
0 голосов
/ 09 января 2020

server. js - это простой express. js файл, использующий токены jwt. В настоящее время я хочу протестировать простой маршрут, который будет возвращать только строку «Hello World», как показано ниже

app.get("/", (req, res) => {
  res.send("Hello World");
});

Приведенный ниже код представляет собой файл jest, который использует supertest для отправки запроса вместе с действительным jwt token

const supertest = require("supertest");

let server, request;
const serverStart = new Promise(resolve => {
  server = require("../server.js");
  request = supertest(server);
  server.on("app_started", () => {
    resolve();
  });
});

beforeAll(async () => {
  await serverStart;
});

afterAll(() => {
  server.close();
});

describe("When testing the server.js", () => {
  it("Should connect successfully and be able to return a response", async () => {
    const response = await request
      .get("/")
      .set("Authorization", `bearer ${process.env.AUTHTOKEN}`);

    expect(response.text).toBe("Hello World");
    console.log(response.text);
  });
});

Когда этот шут (по истечении 5 секунд) говорит, что Timeout - Async callback was not invoked within the 5000ms timeout specified, однако, console.log, который я добавил после того, как ожидаемая функция выводит на консоль «Hello World», означает запрос сделан и возвращает значение, но он продолжает код, но просто пропускает функцию ожидаемого

Я также пытался сделать это с done(), а также с использованием then(), но получил ту же ошибку раз, и я консоль записал время до и после вызова и обнаружил, что для возврата значения требуется всего несколько миллисекунд, так почему же ожидание не завершает тест?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Уверен, что ваша проблема - событие app_started, которое вы слушаете. Я не знаю, где это событие задокументировано. Я думаю, что вы должны использовать listening вместо этого. Я собираюсь сделать некоторые предположения относительно вашего сервера. js file.

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

Это сервер . js файл, с которым я тестирую:

const http = require("http");
const express = require("express");

const app = express();

app.get("/", (req, res) => {
    res.send("hello");
});

const server = http.createServer(app);

server.listen(8081);

module.exports = server;

Это мой тестовый файл server.test. js:

const supertest = require("supertest");

let server, request;

const serverStart = new Promise(resolve => {
    server = require("./server.js");
    request = supertest(server);
    server.on("listening", () => resolve());
});

beforeAll(async () => {
    await serverStart;
});

afterAll(() => {
    server.close();
});

describe("server", () => {
    it("should get hello", async () => {
        const response = await request.get("/");
        expect(response.text).toBe("hello");
    });
});
0 голосов
/ 10 января 2020

Пользователь zero298 указал, что во время функции beforeAll() тест не удался, потому что server.on() ничего не возвращал. В конце я написал обещание на сервере . js, которое разрешается после его запуска, а затем экспортировало это обещание.

let server;
const serverStart = new Promise(resolve => {
  server = app.listen(port, err => {
    if (err) {
      console.log(err);
    }
    console.log("Listening on port " + port);
    resolve();
  });
});

module.exports = app;
module.exports.close = () => server.close();
module.exports.serverStart = serverStart;

и beforeAll() в server.test. js теперь выглядит как

const server = require("../server.js");
let request;

beforeAll(async () => {
  await server.serverStart;
  request = supertest(server);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...