4

我正在测试一个 PowerShell 脚本。我想在不执行整个脚本的情况下测试单个函数。我不确定这是否是预期的用例或受支持,我在网上搜索时找不到好的答案

sut.ps1:

Param(
    [Parameter(Mandatory = $true,
        Position = 0)]
    [ValidateNotNullOrEmpty()]
    [string] $Message
)

function fut([string] $argument) {
    Write-Host $argument
}

function Main() {
    fut($Message)
}

Main

sut.tests.ps1:

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut" "Message"

Describe "fut" {
    It "does something useful" {
        fut 'beer'
    }
}

输出

Message
Describing fut
beer
 [+] does something useful 385ms
Tests completed in 385ms

现在我可以嘲笑“啤酒”,因为它在描述块中运行。但我不能嘲笑“消息”,因为当我点源脚本时脚本开始执行。

就我而言,“消息”是我不想执行的操作。

我在 Windows 10 15063 上。

4

2 回答 2

4

根据评论,问题在于您的脚本是自动执行的,因此如果不执行这些功能,就无法通过点源为 Pester 加载它。

Roman建议的临时使用Set-Alias设置main为的解决方法Out-Null将起作用。另一个建议是将您的函数分离到一个单独的文件(例如 named functions.ps1)中,然后在您的原始脚本中您可以使用点源来包含它,但在您的测试脚本中只需点源functions.ps1文件。

于 2018-01-30T09:26:33.627 回答
0

这将仅在不调用 ny Dot Source 的情况下运行 main 函数,就像纠缠脚本那样。我正在使用它而不是将函数拆分到另一个不需要它的文件。然后 pester 在不调用 Main 函数的情况下运行。

if (-not ($MyInvocation.InvocationName -eq "."))
{
    Main
}
于 2021-10-04T08:28:12.623 回答