[英]How to test asynchronous function with rtl and jest in React
[英]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.