OrA*_*yag 4 node.js express jestjs
我目前遇到的错误是我几个小时都无法解决的。
我正在使用以下版本:
节点:8.11.3
Express:4.16.3
Jest:22.2.2
猫鼬:5.2.3
我正在尝试使用Jest 做一些集成测试,并且我有2个带有测试的文件。
在每个文件中,我写了以下内容:
// Create the server before each test
beforeEach(() => {
server = require('../../index');
});
// Close the server after each test
afterEach(async () => {
if (server) {
server.close();
}
});
Run Code Online (Sandbox Code Playgroud)
在index.js我有以下(这还不是全部的代码,但对于错误相关的代码):
// Listen to the server
const port = config.PORT || process.env.PORT || 3000;
module.exports = app.listen(port, () => {
winston.info(`Listening to port ${port}...`);
});
Run Code Online (Sandbox Code Playgroud)
当我跑步时,我npm test
总是得到这个异常:
**listen EADDRINUSE :::3000**
10 | // Listen to the server
11 | const port = config.PORT || process.env.PORT || 3000;
> 12 | module.exports = app.listen(port, () => {
13 | winston.info(`Listening to port ${port}...`);
14 | });
15 |
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方式加入来解决这个async await来beforeEach和afterEach,并试图也把sever.close中afterAll和beforeAll,但仍然得到了同样的错误。
然后,我尝试通过以下方法解决:
进程被杀死时,如何正常关闭Express Server?
但是再次,没有运气。
最终,当我将所有测试写在1个文件中时,没有this就可以工作error。有人知道如何解决这个问题吗?我不想将所有集成测试写在1个文件中。。
谢谢!
尝试设置--runInBand标志,这将按顺序运行测试。
https://jestjs.io/docs/zh/cli#runinband
在package.json脚本中:
"scripts": {
...
"test": "jest --watchAll --verbose --runInBand",
...
}
Run Code Online (Sandbox Code Playgroud)
[更新]在进一步调查中,虽然可以使用--runInBand顺序运行测试,但是另一个选择是等待server.close(),因为它返回了Promise。因此,在您的afterEach中:
...
await server.close();
...
Run Code Online (Sandbox Code Playgroud)
[更新]我相信解决此问题的更好方法是将index.js文件分离为index.js和server.js文件。这使您无需.listen就可以将index.js文件拉入测试中:
// index.js
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.status(200).send({ hello: "world!" });
});
module.exports = app;
Run Code Online (Sandbox Code Playgroud)
然后在单独的server.js文件中:
const server = require("./index");
const PORT = process.env.PORT || 3001;
server.listen(PORT, () => {
console.log(`App running on: ${PORT}`);
});
module.exports = server;
Run Code Online (Sandbox Code Playgroud)
运行应用程序时,您运行:node server.js。
然后,您可以通过将index.js文件拉入测试中来测试路由,如下所示:
// test.js
const request = require("supertest");
const server = require("./index");
describe("GET /", () => {
test("should return status 200", async () => {
const res = await request(server).get("/");
expect(res.status).toBe(200);
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6800 次 |
| 最近记录: |