簡體   English   中英

忽略expect()函數的玩笑異步測試

[英]jest asynchronous test ignoring expect() function

server.js 是一個使用 jwt 令牌的簡單 express.js 文件。 我目前想測試一個簡單的路由,它只會返回字符串“Hello World”,如下所示

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

下面的代碼是我的玩笑文件,它使用 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 函數輸出“Hello World”到控制台后添加的 console.log 意味着請求被制作並返回一個值,但它與代碼一起運行,但只是跳過了expect函數

我也用done()then()嘗試過這個,但兩次都遇到了同樣的錯誤,我在控制台記錄了調用前后的時間,發現它只需要幾毫秒就可以返回一個值,那么為什么期望似乎沒有完成測試?

很確定您的問題是您正在收聽的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");
    });
});

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM