簡體   English   中英

設置 Express 服務器時 NodeJs Testrunner 凍結/停止

[英]NodeJs Testrunner freezes / stops when setting up Express server

我將 Node v18 與實驗性測試運行程序一起使用。 我使用 express 作為 http 集成測試的開發依賴項,它工作正常,但有一個測試凍結或停止測試運行程序(它不會繼續)

我用的是 TS 但也可以用 JS 重現,測試文件HttpTests.js包含

import assert from 'assert/strict';
import express from 'express';
import test from 'node:test';

test('Http', async () => {
  const server = express();
    
  server.listen(3000);
  assert.ok(false);
});

使用 npm 腳本"test": "node --test $(find. -name '*Tests.js')"會破壞測試運行器。

任何想法有什么問題或缺失?


為什么我不使用默認執行 model

由於我使用的是 TS,因此我必須找到一種將 ts-node 與 testrunner 一起使用的方法。 您可以在這里找到更多信息

https://github.com/nodejs/node/issues/43675

所以目前我的 TS 項目正在使用這個npm 腳本,它工作正常


再生產

我創建了一個最小的復制存儲庫,有和沒有 TypeScript

出於復制目的,運行mkdir reproduction && cd reproduction && npm init -y && npm install express 之后,使用包含如上所示內容的文件HttpTests.js創建一個測試目錄。 package.json更改為

{
  "name": "reproduction",
  "type": "module",
  "scripts": {
    "test": "node --test $(find . -name '*Tests.js')"
  }
}

並運行腳本,testrunner 不應該完成。


測試運行器仍處於試驗階段

是的,我知道。 但是該項目中有許多測試工作得非常好。 一些示例代碼

await t.test('subtest - saves data.', async () => {
    const expectedResult = {};
  
    const api = express();
    const port = await getRandomPort();
    const server = api
        .use(express.json())
        .post('/save', (request, response) => {
            response.json(expectedResult);
        })
        .listen(port);

    const httpDataProvider = new HttpDataProvider({ url: `http://localhost:${port}` });
    const actualResult = await httpDataProvider.saveSomething();

    assert.deepEqual(actualResult, expectedResult);

    server.close();
});

問題是您啟動的異步活動( server.listen() )但在測試錯誤出現之前不停止(由assert.ok(false)引發的異常)。

如果由於相同的問題(不會調用actualResult server.close()實際結果不等於expectedResult結果,您的第二個測試用例也可能會停止。

一種解決方法是始終確保服務器最終關閉:

test('Http', async () => {
  const app    = express();
  const server = app.listen(3000);
  try {
    assert.ok(false);
  } finally {
    server.close();
  }
});

大多數測試框架提供“之前/之后”功能,可用於在測試之前和之后設置或拆除輔助對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM