簡體   English   中英

如何將 ESM 測試與 jest 一起使用?

[英]How to use ESM tests with jest?

我的設置

  • 節點 v14.16.0
  • 我有一個測試文件,其中包含一個用 ESM 模塊 ( import ) 編寫的簡單測試。
  • package.json我有一個腳本(遵循適用於 Windows 的Jest 文檔): "test": "set \"NODE_OPTIONS=--experimental-vm-modules\" && npx jest"
  • 我的測試使用npm run test (上面的腳本)

我的目標:使用 jest 運行 ESM 測試。

我的嘗試:

(1) 帶有 .js 測試的 CommonJS 應用程序

  • package.json包含"type": "commonjs"
  • 名為test.js測試文件
  • 錯誤:語法錯誤: SyntaxError: Cannot use import statement outside a module (這是預期的,因為測試正在作為 commonjs 文件運行。)

(2) 帶有 .mjs 測試的 CommonJS 應用程序

  • package.json包含"type": "commonjs"
  • 名為test.mjs測試文件
  • 錯誤:未找到No tests found (Jest 沒有找到文件?)

(3) 帶 .js 或 .mjs 的 ESM 應用程序

  • package.json現在有"type": "module"
  • 名為test.mjstest.js測試文件
  • 錯誤: ReferenceError: module is not defined at ...jest.config.js:6:1

(4)CommonJS App和CommonJS測試

  • package.json包含"type": "commonjs"
  • 名為test.js的測試文件,但使用 commonjs require語法(並且沒有我想要包含的 ESM 模塊); 請注意,這不是我想要的,只是為了表明測試本身沒有問題。
  • 測試運行良好並通過

以下是我使用 ESM 通過測試運行 Jest 所采取的步驟。 測試中的源文件也是使用 ESM 編寫的。

  1. 將我的節點版本設置為 14.16.0

  2. 安裝 Jest:

     npm i jest -D
  3. "type": "module"添加到package.json

  4. 更新package.json中的test腳本:

     "scripts": { "test": "node --experimental-vm-modules ./node_modules/.bin/jest" }
  5. 創建一個包含以下內容的jest.config.js文件:

     export default { transform: {} }
  6. 至少有一個可以使用默認testMatch找到的測試(我的在__tests__目錄中)

  7. 運行測試:

     npm test

GitHub 上的webpack-strip-debug-loader存儲庫中有一個更完整的示例。

對我來說,只需將腳本“測試”設置如下:

"test": "cross-env NODE_OPTIONS=--experimental-vm-modules npx jest"

是的,別忘了 -> npm i cross-env jest

經過大量的擺弄,這是我成功的設置(重要的部分):

  • package.json
  "type": "commonjs",
  "script": {
    "test": "NODE_OPTIONS=--experimental-vm-modules jest"
  }
  • jest.config.mjs (是的,esModule)
export default {
  moduleFileExtensions: [
    "mjs",
    // must include "js" to pass validation https://github.com/facebook/jest/issues/12116
    "js",
  ],
  testRegex: `test\.mjs$`,
};

必須包含"js"是顯然 .js 文件的時代模塊的歷史遺物。 關注https://github.com/facebook/jest/issues/12116進行更新。

這是您需要的最低要求。 向@Luke 提供上面的評論以及我需要的 testMatch 答案。

  1. package.json - 確保"type": "module"在那里

  2. jest.config.js - 將此 glob 添加到您的testMatch數組中: "**/?(*.)+(spec|test).(m)js"

  3. 確保您的測試文件以.spec.mjs.test.mjs以匹配 glob

  4. 將你的npm test腳本設置為node --experimental-vm-modules ./node_modules/.bin/jest

而已。 正如文檔所建議的那樣,您不需要在 jest 配置中進行轉換設置。

就我而言,離開

  • "type": "module"

並重命名

  • jest.config.jsjest.config.cjs
  • babel.config.jsbabel.config.cjs

工作過

我按照@morganney的回答,但我收到了這個錯誤: "basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")..." 所以為了讓它工作,我使用了文檔中的屬性"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"

因此我的 package.json 最終配置如下:

 {
      "type": "module", 
        "jest": {
          "transform": {}
        },
         "scripts": {
            "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
         }
       "dependencies": {
        "jsdom": "^17.0.0",
       }
    }

暫無
暫無

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

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