Jest 疑難解答

2021-09-18 20:38 更新

哦哦,出事了?使用本指南解決 Jest 的問題。

找不到測試失敗的原因

請嘗試使用 Node 內(nèi)置的調(diào)試功能。注意:這只適用于Node.js 8+。

在你的單元測試中添加一條 ?debugger;?語句,然后在項目目錄中執(zhí)行:

  1. node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
  2. or on Windows
  3. node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]

這將在外部調(diào)試器可以連接到的 Node 進(jìn)程中運行 Jest。請注意,該進(jìn)程將暫停,直到調(diào)試器連接到它為止。

要在 Google Chrome(或任何基于 Chromium 的瀏覽器)中進(jìn)行調(diào)試,請打開瀏覽器并轉(zhuǎn)到?chrome://inspect?并單擊“Open Dedicated DevTools for Node”,這將為你提供可以連接的可用節(jié)點實例列表。?localhost:9229?運行上述命令后,點擊終端中顯示的地址(通常類似于),你將可以使用 Chrome 的 DevTools 調(diào)試 Jest。

Chrome開發(fā)者工具將會被顯示,并在Jest CLI腳本的第一行設(shè)置斷點(這樣做是為了給你時間打開開發(fā)者工具,并在你有時間之前阻止Jest執(zhí)行)。

點擊開發(fā)者工具中右上方調(diào)試菜單欄中的“開始調(diào)試” 按鈕,讓代碼繼續(xù)執(zhí)行。 當(dāng) Jest 執(zhí)行到添加了?debugger; ?語句的單元測試時,執(zhí)行就會暫停,此時,你可以檢查當(dāng)前的值域和調(diào)用棧。

注意: ?--runInBand? cli 選項確保 Jest 在同一進(jìn)程中運行測試,而不是為單個測試生成進(jìn)程。通常情況下,Jest 并行化測試會跨進(jìn)程執(zhí)行,但是很難同時調(diào)試多個進(jìn)程。

在 VS Code 中調(diào)試

有多種方法可以使用Visual Studio Code 的內(nèi)置調(diào)試器來調(diào)試 Jest 測試。

要附加內(nèi)置調(diào)試器,請按上述方式運行測試:

  1. node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here]
  2. or on Windows
  3. node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]

然后使用以下?launch.json?配置附加 VS Code 的調(diào)試器:

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "type": "node",
  6. "request": "attach",
  7. "name": "Attach",
  8. "port": 9229
  9. }
  10. ]
  11. }

要自動啟動并附加到運行測試的進(jìn)程,請使用以下配置:

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name": "Debug Jest Tests",
  6. "type": "node",
  7. "request": "launch",
  8. "runtimeArgs": [
  9. "--inspect-brk",
  10. "${workspaceRoot}/node_modules/.bin/jest",
  11. "--runInBand"
  12. ],
  13. "console": "integratedTerminal",
  14. "internalConsoleOptions": "neverOpen",
  15. "port": 9229
  16. }
  17. ]
  18. }

或以下適用于 Windows:

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name": "Debug Jest Tests",
  6. "type": "node",
  7. "request": "launch",
  8. "runtimeArgs": [
  9. "--inspect-brk",
  10. "${workspaceRoot}/node_modules/jest/bin/jest.js",
  11. "--runInBand"
  12. ],
  13. "console": "integratedTerminal",
  14. "internalConsoleOptions": "neverOpen",
  15. "port": 9229
  16. }
  17. ]
  18. }

如果你使用 Facebook 的create-react-app,可以使用以下配置調(diào)試你的 Jest 測試:

  1. {
  2. "version": "0.2.0",
  3. "configurations": [
  4. {
  5. "name": "Debug CRA Tests",
  6. "type": "node",
  7. "request": "launch",
  8. "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
  9. "args": ["test", "--runInBand", "--no-cache", "--env=jsdom"],
  10. "cwd": "${workspaceRoot}",
  11. "protocol": "inspector",
  12. "console": "integratedTerminal",
  13. "internalConsoleOptions": "neverOpen"
  14. }
  15. ]
  16. }

更多關(guān)于 Node 調(diào)試的信息,可以查看這里。

在 WebStorm 中調(diào)試

WebStorm 中調(diào)試 Jest 測試的最簡單方法是使用?Jest run/debug configuration?. 它將啟動測試并自動附加調(diào)試器。

在 WebStorm 菜單中Run選擇?Edit Configurations...?。然后單擊?+?并選擇Jest。(可選)指定 Jest 配置文件、附加選項和環(huán)境變量。保存配置,在代碼中放置斷點,然后點擊綠色調(diào)試圖標(biāo)開始調(diào)試。

如果你使用 Facebook 的create-react-app,請在 Jest 運行/調(diào)試配置react-scripts中的 Jest 包字段中指定包的路徑并添加?--env=jsdom?到 Jest 選項字段。

緩存問題

轉(zhuǎn)換腳本已更改或 Babel 已更新并且 Jest 無法識別更改?

嘗試使用? --no-cache ?選項。 Jest 會緩存轉(zhuǎn)換的模塊文件來加速測試的執(zhí)行。如果你在使用自己的自定義轉(zhuǎn)換器,請考慮將GETCaseKEY函數(shù)添加到它:getCacheKey in Relay.

未返回的 Promises

如果一個 Promise 并未返回任何東西(no resolve)你會看到類似于下邊的報錯:

  1. - Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`

通常這是由沖突的Promise 實現(xiàn)引發(fā)的。 考慮用自己的替代全局承諾實現(xiàn),例如Global,?Posiv= Jest.RealEngor(“promise”);?和/或?qū)⑹褂眠^的Promise庫合并為單個庫。

如果你的測試長時間運行,可能需要考慮通過調(diào)用來增加超時時間 jest.setTimeout

  1. jest.setTimeout(10000); // 10 second timeout

看門狗問題

嘗試運行 Jest--no-watchman或?qū)atchman配置選項設(shè)置為false.

更多詳情,查看 看門狗疑難解答.

Docker 和/或 持續(xù)集成(CI,Continuous Integration)服務(wù)器中執(zhí)行 Jest 測試極慢。

雖然 Jest 是大部分時間非??斓默F(xiàn)代多核計算機具有快速的固態(tài)硬盤,它可能是緩慢的某些設(shè)置,已經(jīng)被我們的用戶發(fā)現(xiàn)了。

根據(jù)調(diào)查結(jié)果,緩解此問題并將速度提高多達(dá) 50% 的一種方法是按順序運行測試。

達(dá)成上述目的,可以使用?--runInBand?選項:

  1. # Using Jest CLI
  2. jest --runInBand
  3. # Using yarn test (e.g. with create-react-app)
  4. yarn test --runInBand

在 Travis-CI 等持續(xù)集成服務(wù)器上加快測試執(zhí)行時間的另一種選擇是將最大工作池設(shè)置為 ~ 4。特別是在 Travis-CI 上,這可以將測試執(zhí)行時間減少一半。注意:可用于開源項目的 Travis CI免費計劃僅包含 2 個 CPU 內(nèi)核。

  1. # Using Jest CLI
  2. jest --maxWorkers=4
  3. # Using yarn test (e.g. with create-react-app)
  4. yarn test --maxWorkers=4

coveragePathIgnorePatterns 似乎沒有任何影響。

確保你沒有使用該babel-plugin-istanbul插件。Jest 包裝了Istanbul,因此也告訴Istanbul 哪些文件要使用覆蓋率收集進(jìn)行檢測。使用時babel-plugin-istanbul,Babel 處理的每個文件都會有覆蓋率收集代碼,因此不會被?coveragePathIgnorePatterns?.

定義測試

必須同步定義測試,Jest 才能收集你的測試。

舉個例子來說明為什么會這樣,假設(shè)我們寫了一個這樣的測試:

  1. // Don't do this it will not work
  2. setTimeout(() => {
  3. it('passes', () => expect(1).toBe(1));
  4. }, 0);

當(dāng) Jest 運行你的測試以收集tests 時,它不會找到任何內(nèi)容,因為我們已將定義設(shè)置為在事件循環(huán)的下一個滴答聲中異步發(fā)生。

注意:這意味著當(dāng)你使用test.each時,你不能在beforeEach/中異步設(shè)置表beforeAll。

尚未解決問題?

點 這里 查看幫助


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號