簡體   English   中英

Powershell Core + Pester - 將測試與 src 分開

[英]Powershell Core + Pester - Separating tests from src

問題:

將函數導入不在同一目錄中的測試的最佳方法是什么?

例子

📁 src
      📄 Get-Emoji.ps1
📁 test
      📄 Get-Emoji.Tests.ps1

Inb4

  • Pester 文檔[1] 建議將測試文件放在與他們測試的代碼相同的目錄中。 沒有提供替代品的例子。
  • Pester 文檔[2] 建議使用 dot-sourcing 來導入文件。 僅來自同一目錄中的示例
  • 從 src 中拆分測試是否是好的做法,將在別處討論
  • 使用 Powershell 內核在不同的操作系統文件系統上提供跨平台支持(正斜杠與反斜杠)

[1] 文件放置和命名約定

Pester 認為所有名為.Tests.ps1 的文件都是測試文件。 這是幾乎所有項目都使用的默認命名約定。

測試文件與它們測試的代碼放置在同一目錄中。 每個文件都稱為它測試的 function。 這意味着對於 function Get-Emoji,我們將在同一目錄中擁有 Get-Emoji.Tests.ps1 和 Get-Emoji.ps1。 將測試引用到 Pester 中的函數的最佳方法是什么。

[2] 導入測試函數

Pester 測試放在 .Tests.ps1 文件中,例如 Get-Emoji.Tests.ps1。 代碼放在 Get-Emoji.ps1 中。

為了使測試代碼可用於測試,我們需要導入代碼文件。 這是通過將文件點源到當前的 scope 來完成的,如下所示:

示例 1

 # at the top of Get-Emoji.Tests.ps1 BeforeAll {. $PSScriptRoot/Get-Emoji.ps1 }

示例 2

 # at the top of Get-Emoji.Tests.ps1 BeforeAll {. $PSCommandPath.Replace('.Tests.ps1','.ps1') }

我傾向於將我的測試放在一個文件夾中,該文件夾與腳本所在的位置相距一兩個父級別(通常位於命名模塊目錄下,然后位於名為 Private 或 Public 的文件夾中)。 我只是點源我的腳本或模塊,並使用..$PSScriptRoot (當前腳本路徑)作為參考點來引用父路徑。 例如:

  • \SomeModule\Public\get-something.ps1中的腳本
  • \Tests\get-something.tests.ps1中的測試
BeforeAll { 
    . $PSScriptRoot\..\SomeModule\Public\get-something.ps1    
}

如果需要考慮跨平台兼容性,請使用正斜杠,Windows 不介意路徑分隔符是正斜杠還是反斜杠。 如果您想確定使用了有效的完整路徑,您也可以首先通過Resolve-Path運行此路徑,但我通常認為沒有必要。

暫無
暫無

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

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