纠缠者:如何让我的脚本不被 运行 发现?

Pester: How do I keep my script from running?

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

总结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

现在我可以模拟 'beer',因为它在 describe 块中运行。但我无法模拟 'message',因为脚本在我点源时开始执行。

在我的例子中,'message' 是我不想执行的操作。

我在 Windows 10 15063。

根据评论,问题是您的脚本是自执行的,因此如果不执行函数,则无法通过点源为 Pester 加载它。

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

如果它不像 pester 脚本那样被称为 ny Dot Source,这只会 运行 主要功能。我正在使用它而不是将函数拆分到不需要它的另一个文件。然后在不调用 Main 函数的情况下纠缠 运行s。

if (-not ($MyInvocation.InvocationName -eq "."))
{
    Main
}