【问题标题】:Powershell Core + Pester - Separating tests from srcPowershell Core + Pester - 将测试与 src 分离
【发布时间】:2020-12-05 18:03:35
【问题描述】:

问题:

将函数导入不在同一目录中的测试的最佳方法是什么?

例子

???? src
      ???? Get-Emoji.ps1
???? test
      ???? Get-Emoji.Tests.ps1

Inb4

  • Pester 文档[1] 建议将测试文件放在与他们测试的代码相同的目录中。未提供替代示例。
  • Pester 文档[2] 建议使用 dot-sourcing 来导入文件。仅适用于同一目录中的示例
  • 从 src 中分出测试是否是好的做法,将在别处讨论
  • 使用 Powershell Core 在不同操作系统文件系统上提供跨平台支持(正斜杠与反斜杠)

[1]File placement and naming convention

Pester 将所有名为 .Tests.ps1 的文件视为测试文件。这是几乎所有项目都使用的默认命名约定。

测试文件与它们测试的代码放置在同一目录中。每个文件都被称为它测试的函数。这意味着对于 Get-Emoji 函数,我们将 Get-Emoji.Tests.ps1 和 Get-Emoji.ps1 放在同一目录中。将测试引用到 Pester 中的函数的最佳方法是什么。

[2]Importing the tested functions

Pester 测试放在 .Tests.ps1 文件中,例如 Get-Emoji.Tests.ps1。代码放在Get-Emoji.ps1中。

为了使测试代码可用于测试,我们需要导入代码文件。这是通过将文件点源到当前范围来完成的,如下所示:

示例 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')
}

【问题讨论】:

  • 不确定我是否理解问题所在。点采购不是一种选择吗?
  • 当然,dot sourcing 有效。但是最好的方法是什么?例如,另一种选择可能是. ([IO.Path]::Combine($PSEditor.Workspace.Path, "path/to/function/Get-Emoji.ps1"))
  • 另一个要考虑的维度是绝对路径与相对路径。

标签: powershell unit-testing powershell-core pester


【解决方案1】:

我倾向于将我的测试放在一个文件夹中,该文件夹与脚本所在的位置相距一两个父级(通常位于命名的模块目录下,然后位于名为 Private 或 Public 的文件夹中)。我只是点源我的脚本或模块并使用..$PSScriptRoot(当前脚本路径)作为参考点来引用父路径。例如:

  • \SomeModule\Public\get-something.ps1 中的脚本
  • \Tests\get-something.tests.ps1 中的测试
BeforeAll { 
    . $PSScriptRoot\..\SomeModule\Public\get-something.ps1    
}

如果考虑跨平台兼容性,请使用正斜杠,Windows 不介意路径分隔符是正斜杠还是反斜杠。如果您想确定使用了有效的完整路径,也可以先通过Resolve-Path 运行此路径,但我通常认为没有必要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多