我正在使用Jest库运行节点项目的单元测试,一切都很好。当我为路由身份验证创建新的测试时,它开始显示服务器已经在端口4000上运行,即使我使用afterEach()函数关闭服务,但不知道为什么服务器仍然在端口4000上运行。
甚至我已经删除了路由身份验证的新测试,并通过关闭所有终端重新启动我的项目,但是每当我运行该项目时,它就开始显示服务器已经在端口4000上运行的错误。
下面是用户测试文件中的代码,其中我正确地关闭了服务器,在下一个测试文件中,我再次使用了用于服务器连接和关闭的相同功能。
const request = require("supertest");
const { Genre } = require("../../models/genre");
const { User } = require("../../models/user");
const mongoose = require("mongoose");
let server;
describe("/api/genres", () => {
beforeEach(() => {
server = require("../../index");
});
afterEach(async () => {
server.close();
await Genre.remove({});
});第二次测试文件代码
const { User } = require("../../models/user");
const { Genre } = require("../../models/genre");
const request = require("supertest");
describe("auth middleware", () => {
beforeEach(() => {
server = require("../../index");
});
afterEach(async () => {
await Genre.remove({});
server.close();
});这是.的产出。如果没有提供令牌,auth中间件>应该返回401
listen EADDRINUSE: address already in use :::4000
10 |
11 | const port = process.env.PORT || 4000;
> 12 | const server = app.listen(port, () =>
| ^
at Function.listen (node_modules/express/lib/application.js:618:24)
at Object.<anonymous> (index.js:12:20)
at Object.<anonymous> (tests/integration/auth.test.js:6:14)测试套件:1次失败,3次通过,4次总测试:1次失败,26次通过,27次总快照:0次总时间:13.606秒运行所有测试套件。
Index.js码
const winston = require("winston");
const express = require("express");
const app = express();
require("./startup/logging")();
require("./startup/routes")(app);
require("./startup/db")();
require("./startup/config")();
require("./startup/validation")();
const port = process.env.PORT || 4000;
const server = app.listen(port, () =>
winston.info(`Listening on port ${port}...`)
);
module.exports = server;发布于 2019-11-08 07:21:24
我不是Node.js方面的专家,但是您的bug的本质非常简单;您正在尝试在一个已经被监听的端口上侦听。
This贴子提供了对require()的可靠描述,我认为这是您麻烦的根源。
通过在每个测试用例程序中调用require("../../index"),可以有效地导出服务器两次,这将导致两个app.listen()调用。
您最好一次性将服务器导出到某个主测试程序,在该程序中,您可以通过对每个测试文件调用require()来运行所有测试用例。从长远来看,这种方法也要好得多,因为添加额外的测试用例将更加容易;您只需编写一个新的测试脚本,将其导出到您的主测试程序,并将其附加到您的测试用例列表中。
发布于 2019-11-07 15:18:21
您的测试是多次创建服务器(index.js)。这使得服务器在许多情况下都试图侦听同一个端口。Jest文档上写着,
--如果您在许多测试中需要反复做一些工作,可以使用beforeEach和afterEach。
很明显,您应该创建服务器一次,做所有的测试,并关闭它一次。其方法是beforeAll和afterAll。
在某些情况下,只需要在文件开始时安装一次
。当设置是异步的时,这可能特别麻烦,所以您不能内联地执行它。Jest提供了beforeAll和afterAll来处理这种情况。
所以,你的测试应该是,
describe("auth middleware", () => {
beforeAll(() => {
server = require("../../index");
});
afterAll(async () => {
await Genre.remove({});
server.close();
});https://stackoverflow.com/questions/58750447
复制相似问题