当我的测试套件初始化我的服务器时,为啥我的 node.js HTTP 请求会失败?

Posted

技术标签:

【中文标题】当我的测试套件初始化我的服务器时,为啥我的 node.js HTTP 请求会失败?【英文标题】:Why does my node.js HTTP requests fail when my server is initialized by my test suite?当我的测试套件初始化我的服务器时,为什么我的 node.js HTTP 请求会失败? 【发布时间】:2021-12-29 00:03:26 【问题描述】:

我一直在尝试为我的 node.js API 项目编写一个测试套件,他们的要求之一是控制服务器何时启动和停止。为此,我在下面使用两个函数编写了这段代码:initializeWebServerstopWebServer

express.js

const initializeWebServer = () => 
  return new Promise((resolve, reject) => 
    app = express();

    /* some middlewares */

    app.use('/', userRoutes);

    httpServer = http.createServer(app);

    httpServer.listen(3000, (err) => 
      if (err) 
        reject(err);
        return;
      

      resolve(app);
    );
  );
;

const stopWebServer = () => 
  return new Promise((resolve, reject) => 
    httpServer.close(() =>  resolve(); );
  );
;

使用mocha 运行我的测试,我选择使用beforeafter 挂钩管理我的服务器连接,使用async/await 语法。

user.spec.js

let axiosAPIClient;

before(async () => 
  await initializeWebServer();
  const axiosConfig = 
    baseURL: `http://localhost:3000`,
    validateStatus: () => true
  ;
  axiosAPIClient = axios.create(axiosConfig);
);

after(async () => 
  await stopWebServer();
);

describe('POST /api/user', () => 
it('when add a new user, then should get back approval with 200 response', async () => 
  const userData = 
    /* user props */
  ;

  const response = await axiosAPIClient.post('/api/user', userData);

  expect(response).to.containSubset(
    status: 200,
    data:  message: 'User signed up.' 
  );

axios(我也试过fetch)提交任何HTTP请求时,mocha返回以下错误:Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.。我尝试增加超时间隔,但没有奏效。

如果我在没有钩子的情况下执行我的测试套件,使用nodemon 初始化我的服务器,并使用相同的await initializeWebServer(); 指向我的索引文件,HTTP 请求就会正常工作。

我真的不明白为什么会这样,我认为是 mocha 的问题。

【问题讨论】:

有没有可能是 http 请求本身永远无法完成? 如果我将 --timeout 0 标志放在 mocha 上,它会永远挂起,也会阻止另一个请求。当我开始编写和运行这个测试用例时,axios requests 正在工作。突然,这个错误发生了,我被卡住了。 您的第一步应该是找出它挂在哪里的确切位置。是在考试期间吗?在清理期间? console.log 是一种简单的入门方法(或连接真正的调试器) 【参考方案1】:

我做了一些调试测试,发现我在运行测试套件时忘记设置数据库连接,包括在beforeafter 挂钩中。这是一个简单的错误。

user.spec.js

let axiosAPIClient;

before(async () => 
  await initializeWebServer();
  db.setUp();

  /* axios config etc. */

after(async () => 
  await stopWebServer();
  await db.closeConnection();
);

【讨论】:

删除答案,或更新您的回复,详细说明您如何修复它。

以上是关于当我的测试套件初始化我的服务器时,为啥我的 node.js HTTP 请求会失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Minitest 测试没有并行运行?

从 maven 执行 Testng 套件文件时,它会被忽略,因此不会调用我的侦听器

为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?

为啥我的添加好友测试路由在 insomina 中通过了 200 OK,但是当我调用获取所有用户时它没有嵌套?

为啥在ubuntu服务器的nod​​ejs中动态创建目录时出错?

为啥我的测试一起运行时通过,但单独失败?