为什么即使在我关闭服务器后,服务器也已经在端口4000上运行

我正在使用Jest库在我的节点项目中运行单元测试,一切工作正常。当我为路由身份验证创建新测试时,它甚至开始显示服务器已经在端口4000上运行,即使我正在使用afterEach()函数来关闭服务,但也不知道为什么仍然在端口4000上运行服务器。

即使我已经删除了用于路由身份验证的新测试,并通过关闭所有终端重新启动了我的项目,但是每当我运行该项目时,它就会开始显示错误,表明服务器已经在端口4000上运行。

这是用户测试文件中的代码,可以正确关闭服务器,而在下一个测试文件中,我再次使用相同的功能进行服务器连接和关闭。

imeiListBox.SelectedItem as Device;

第二个测试文件代码

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

这是...........................的输出。  ●身份验证中间件›如果未提供令牌,则应返回401

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

测试套件:1个失败,3个通过,总共4个 测试:1个失败,26个通过,总共27个 快照:共0个 时间:13.606秒 运行所有测试套件。

Index.js代码

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)
littlejade 回答:为什么即使在我关闭服务器后,服务器也已经在端口4000上运行

您的测试正在多次创建服务器(index.js)。这使得服务器在许多情况下尝试侦听同一端口。 Jest文档的内容为

  

如果您有一些工作需要多次进行多次测试,那么您   可以使用beforeEach和afterEach。

很明显,您应该一次创建服务器,执行所有测试然后关闭一次。的方法是kill -9 pidbeforeAll

  

在某些情况下,您只需要在   文件。当设置为   异步的,所以您不能内联。笑话提供beforeAll和   毕竟可以解决这种情况。

因此,您的测试应如下所示

afterAll
,

我不是Node.js的专家,但是您的错误的性质非常简单;您正在尝试在已经被监听的端口上监听。

This帖子提供了require()的详尽描述,我相信这是您遇到麻烦的原因。

通过在每个测试用例程序中调用require("../../index"),可以有效地导出服务器两次,这将导致两次app.listen()调用。

一次将服务器导出到某个主测试程序将带来无限的好处,然后您可以通过在每个测试文件上调用require()来运行所有测试用例。从长远来看,这种方法也要好得多,因为添加更多的测试用例会容易1000倍。您可以只编写一个新的测试脚本,将其导出到您的主测试程序中,然后将其附加到您的测试用例列表中。

本文链接:https://www.f2er.com/3144234.html

大家都在问