![](/img/trans.png)
[英]Jest collectCoverageFrom and coverageThreshold not working
[英]What is the proper way to escape quotes and slashes when running a Jest test with --collectCoverageFrom from Powershell via npm scripts?
I am a React developer, and am used to running commands like the example below from Bash in Linux, but now I have to make it work in a Windows environment from Powershell:
npm test ExampleComponent --collectCoverageFrom='["**/ExampleComponent.tsx"]' --watch
npm 測試腳本中只有“jest”,但我需要通過腳本使用它,以便我在項目中使用 jest 的版本,而不是全局。
我在嘗試填補特定文件( ExampleComponent.tsx
)中代碼覆蓋率的空白時使用它,所以我希望 Jest 在我將更改保存到測試文件( ExampleComponent.test.tsx
)時重新評估該文件的覆蓋率在這種情況下)。
這就是我在 Powershell 中運行的內容(在"--"
中添加了引號,因為 Powershell 不處理--
就像 bash 一樣,並從正斜杠切換到 Windows 的反斜杠:
npm test "--" ExampleComponent --collectCoverageFrom='["**\ExampleComponent.tsx"]' --watch
這是根據 npm 的 output 調用 jest 的方式:
jest "ExampleComponent" "--collectCoverageFrom=[**\ExampleComponent.tsx]" "--watch"
在 Powershell(版本 7.2,如果這很重要)中,上面的命令不會將覆蓋檢查限制到指定的文件。 它只測試指定的文件,但可能會忽略collectCoverageFrom
選項,因為 jest 接收到的模式被 Powershell 破壞了。
如何從 Powershell 命令行中轉義引號和斜杠以復制頂部的 bash 調用? 根據 Powershell 中有關 escaping 的答案,我嘗試了多種反斜杠和多個引號的組合,但到目前為止它們都沒有奏效。
我找到了一個有效的版本:
npm t "--" ExampleComponent --collectCoverageFrom="'[\\\""**/ExampleComponent.tsx\\\""]'"
該命令似乎按預期運行,僅計算指定文件的覆蓋率。
Jest 將命令回顯為:
jest "ExampleComponent" "--collectCoverageFrom='[\"**/ExampleComponent.tsx\"]'"
處理后的版本在雙引號之前有反斜杠,因為整個參數已經包含在雙引號中。 我還必須將反斜杠改回正斜杠。
感謝@mklement0 在問題評論中的投入。
您的解決方案是有效的,但讓我添加重要的背景信息:
核心問題是悲慘的現實,至少在 PowerShell 7.2 之前,在 arguments 中需要額外的手動層\
-轉義嵌入的"
字符”傳遞給外部程序。這可能會在未來的版本中得到修復,這可能需要選擇 -中。有關詳細信息,請參閱此答案。
在您的特定情況下,由於必須執行此 escaping兩次,問題顯然更加復雜,因為涉及兩個調用:首先,到npm
,然后將一些 arguments中繼到jest
。
最終,在它解析了自己的命令行(在 Windows 上)之后,您希望逐字逐句jest
看到以下字符串:
--collectCoverageFrom='["**/ExampleComponent.tsx"]'
順便說一句:您的bash
命令沒有實現這一點,因為'
具有語法function (就像它們在 PowerShell 中所做的那樣)並且在傳遞結果字符串之前被bash
刪除
如果 PowerShell 錯誤不在圖片中,您將使用以下內容:
npm t '--' ExampleComponent --collectCoverageFrom='''["**/ExampleComponent.tsx"]'''
請注意嵌入在整個''
'...'
逐字字符串中的 '' ,它們是轉義'
字符。 被逐字包含在字符串中。
或者,您可以使用"..."
進行外部引用,然后要求您將嵌入的"
chars. as `"
(或""
[1] )轉義:
npm t '--' ExampleComponent --collectCoverageFrom="'[`"**/ExampleComponent.tsx`"]'"
但是請注意,這種雙引號字符串是可擴展的字符串,即受到字符串插值的影響。 通常最好對不需要插值的字符串使用逐字字符串 ( '...'
),以便概念清晰並防止可能不需要的插值(這里不是問題,因為該字符串不包含應逐字的$
或`
字符)。
由於沒有關於嵌入"
字符的錯誤,因此中繼arguments 也沒有問題 - 無論執行多少次。
實際上,如果您使用的是 PowerShell 7.2,則可以進行此操作,但前提是您明確啟用了PSNativeCommandArgumentPassing
實驗功能:
Enable-ExperimentalFeature PSNativeCommandArgumentPassing
$PSNativeCommandArgumentPassing = 'Standard'
以便將修復程序也應用於批處理文件( *.cmd
, *.bat
),這是必要的,因為npm
已實現
'Windows'
)將批處理文件和 WSH 腳本文件(JScript、VBScript)從修復中排除,而不是應用目標腳本引擎相應的自動修復 - 請參閱GitHub 問題 #15143中的對話稍后運行Disable-ExperimentalFeature PSNativeCommandArgumentPassing
以再次禁用它。
存在錯誤:
由於該錯誤,字符串中嵌入的"
字符需要手動\
- escaping - 無論您使用的是'...'
還是"..."
字符串:
如果只涉及一個電話,這意味着:
# Note the \-escaped "
npm t '--' ExampleComponent --collectCoverageFrom='''[\"**/ExampleComponent.tsx\"]'''
這將使npm
看到所需的逐字字符串。
npm
然后將有問題的論點傳遞給jest
,所以必須應用額外的一輪 escaping :# Note the \-escaped ", preceded by an \-escaped \
npm t '--' ExampleComponent --collectCoverageFrom='''[\\\"**/ExampleComponent.tsx\\\"]'''
那是:
npm
的調用有效地將\"
變為"
\
-轉義,以便"
chars." 也保留在對jest
的調用中。\\
- 即轉義的\
添加到 - \"
( \\\"
), npm
最終會看到逐字\"
,當通過 PowerShell中繼時,可以根據需要讓jest
只看到"
。 [1] 雖然""
在"..."
內工作正常,但它只在那里工作。 相比之下, `"
使用 PowerShell 的通用轉義字符,即反引號 ( `
) - 並且無論上下文如何,都必須只記住一個字符,從而減少了用戶的 memory 負擔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.