【问题标题】:jest asynchronous test ignoring expect() function开玩笑的异步测试忽略了expect()函数
【发布时间】:2020-01-11 03:57:53
【问题描述】:

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 但是,我在期望函数输出“Hello World”到控制台后添加的 console.log 意味着发出请求并返回一个值但它与代码一起运行,但只是跳过了期望函数

我也尝试过使用done()then(),但两次都出现相同的错误,我在控制台记录了通话前后的时间,发现只需要几毫秒即可返回一个值,那么为什么期望似乎没有完成测试?

【问题讨论】:

  • 你不应该调用 serverStart 而不是 await serverStart 吗?应该是await serverStart()
  • @AshishModi 为什么?这是一个承诺,而不是一个功能。
  • @AjayDabas 我的错。没想到
  • @Blingdude 我不是在“跳过”预期的功能。单元测试只需要比指定限制更长的时间(此处默认限制为 5000 毫秒)。尝试将时间限制增加到 10000 毫秒。您可以在 it() 函数中执行此操作,如下所示:it("",()=>{...},10000)
  • 是的,我尝试将超时时间增加到 30000,但它表示相同的消息,但改为 30000:/

标签: javascript node.js express jestjs


【解决方案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");
    });
});

【讨论】:

  • 所以我尝试将其更改为“监听”,并在 server.js 中添加了一个控制台日志,输出“监听端口 [portNumber]”。它输出添加的控制台日志,并在异步超时后继续给出相同的错误。
【解决方案2】:

用户 zero298 指出在 beforeAll() 函数期间测试失败,因为 server.on() 没有返回任何内容。最后,我在 server.js 中编写了 Promise,它在启动后解析,然后导出了这个 Promise。

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);
});

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多