开玩笑的异步测试,忽略了Expect()函数

时间:2020-01-09 15:44:10

标签: javascript node.js express jestjs

server.js是使用jwt令牌的简单express.js文件。我目前要测试一条仅返回字符串“ Hello World”的简单路由,如下所示

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

下面的代码是我的jest文件,该文件使用supertest来发送请求以及有效的jwt令牌

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,我在Expect函数之后添加的console.log向控制台输出“ Hello World”,表示已发出请求并返回一个值,但是它与代码一起使用,但是只是跳过了期望函数

我也尝试过使用done()then()进行此操作,但是两次都遇到相同的错误,并且我在控制台上记录了呼叫前后的时间,发现只需要一个几毫秒即可返回值,那么为什么期望值似乎无法完成测试?

2 个答案:

答案 0 :(得分:1)

很确定您的问题是您正在听的app_started事件。我不知道该事件在哪里记录。我认为您应该改用listening。我将对您的 server.js 文件进行一些假设。

以下测试通过。我认为您的测试永远不会真正开始,因为您正在监听一个永远不会触发的事件。

这是我正在测试的 server.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");
    });
});

答案 1 :(得分:0)

用户zero298指出在beforeAll()函数期间测试失败,因为server.on()没有返回任何内容。最后,我在 server.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;

server.test.js 中的beforeAll()现在看起来像

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

beforeAll(async () => {
  await server.serverStart;
  request = supertest(server);
});