回到文章列表

[狀況記錄] 關於跑 Unit Test 時,顯示 SecurityError 錯誤訊息 (解決)

TWGD / 2018-09-03

❗ unsupported type: quote

當時 fork 第一期的教材並 clone 專案到本機,照導師的影片教學一步步操作,code 也沒有寫錯,但不知怎麼回事,不僅無法看到 pass 的綠燈,還一直跑出 SecurityError 訊息,認真讀 command line 也一點頭緒也沒有,一度懷疑自己是不是遇到平行時空。我之前在 這篇心得 中也有記錄這個狀況。

狀況:跑 Unit Test 時,顯示 SecurityError 錯誤訊息

SecurityError: localStorage is not available for opaque origins

嘗試解決的過程:

  • Google 問題
  • 參考 這則 issue Stack Overflow 討論,大概得知要透過修改 Jest 的 configuration,手動添加 URL 來解決。
  • 我採用直接在 package.json 裡添加:
  • {
      "jest": {
        "verbose": true,
        "testURL": "<http://localhost/>"
      },
    }
    

    結果:

  • SecurityError 問題解決!運行 Unit Test:Pass!:white_check_mark:
  • 關於這個 error 的可能原因:

    這則 Bug Report 整理了簡要的敘述:與 JSDom 11.12 這個版本更新有關。

    我對這則 Bug Report 的理解是:JSDom 11.12 支援了 window.localStorage 等其他功能。推測 Jest 採用了這個新版本,使得既有版本的 預設 URL 造成錯誤。(有理解錯誤的話請導師指正~)


    更新 1:目前這個 Bug 似乎已被修復 (?)

    Jest 23.5.0 已經不會遇到問題:

    最近新增了新專案,Jest 版本是 23.5.0,跑 Unit Test 的時候,已不會遇到這個狀況。 JSDom 發表了 12.0.0版本更新,似乎已經修復了這個 Bug。

    新專案 Run npx envinfo --preset jest 結果:

    System:
        OS: OS X El Capitan 10.11.6
        CPU: x64 Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
    Binaries:
        Node: 8.11.3
        npm: 5.6.0
    npmPackages:
        jest: ^23.5.0 => 23.5.0
    

    Jest 22.4.4 版本還是一樣問題:

    clone「mentor-program-2nd-twgd」下來後,npm 用原本 package.json 檔裡的紀錄載回套件,又遇到了一樣的問題。

    「mentor-program-2nd-twgd」專案 Run npx envinfo --preset jest 結果:

    System:
        OS: OS X El Capitan 10.11.6
        CPU: x64 Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
    Binaries:
        Node: 8.11.3
        npm: 5.6.0
    npmPackages:
        jest: ^22.4.4 => 22.4.4
    

    更新 2:這次「mentor-program-2nd-twgd」又遇到這個問題,我嘗試了兩個作法:

    作法 (1):

    package.json 裡添加:

    {
      "jest": {
        "verbose": true,
        "testURL": "<http://localhost/>"
      },
    }
    
  • 結果:運行 Unit Test:Pass!:white_check_mark:
  • 作法 (2):

    想說 23.5.0 版本 Jest 沒問題,輸入以下指令 update 看看:

    npm install --save-dev jest@23.5.0
    

    運行 Unit Test 居然又有錯誤訊息 (崩潰):

    Couldn't find preset "es2015" relative to directory
    

    仔細看了一下,這個錯誤訊息有點眼熟,好像跟 babel 有關,Google 確定了一下問題,需要安裝 babel-preset-es2015,輸入以下指令裝 babel-clibabel-preset-es2015

    npm install --save-dev babel-cli babel-preset-es2015
    
  • 結果:運行 Unit Test:Pass!:white_check_mark:
  • 更新 3:導師 huli 的解決辦法

    package.json 裡添加:

    "test": "jest --env=node"
    

    把運行環境設定到 node

    查到一則相關的 PR 表示:較小版本預設運行環境是 jsdom,把環境改成 node 運行就可以解決這個問題。


    參考資料整理:

  • Stack Overflow 討論
  • JSDom issue 2304
  • Jest issue 6766
  • 2018 年了,你还是只会 npm install 吗?