powershell 如何阻止我的脚本运行?

xesrikrc  于 2023-10-18  发布在  Shell
关注(0)|答案(3)|浏览(139)

我正在测试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

现在我可以把“beer”去掉了,因为它在describe块中运行。但是我不能嘲笑“消息”,因为脚本在我点源化它时开始执行。
在我的例子中,“消息”是我不想执行的操作。
Windows 10 15063

sqserrrh

sqserrrh1#

根据评论,问题是你的脚本是自执行的,所以不可能通过点源为Pester加载它而不执行函数。
Roman建议的临时使用Set-Aliasmain设置为Out-Null的解决方法可以工作。另一个建议是将你的函数分离到一个单独的文件中(例如名为functions.ps1),然后在你的原始脚本中你可以使用点源来包含它,但是在你的测试脚本中只需要点源functions.ps1文件。

t98cgbkg

t98cgbkg2#

这将只运行主函数,如果它不被称为ny点源,作为一个pester脚本将。我使用这个函数,而不是将函数拆分到另一个不需要它的文件中。然后pester运行而不调用Main函数。

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

jljoyd4f3#

如果你出于某种原因

  • 我希望将所有功能保留在单个脚本中(而不是在模块中或拆分为多个文件)
  • 我需要在脚本为点源代码时执行的功能
  • 我想使用Pester测试脚本的功能
  • 我不介意在脚本中添加一些可测试性增强逻辑

一种方法是添加逻辑,该逻辑在提供开关参数时跳过自动执行脚本的功能。
我使用类似的东西来保持我的Azure自动化运行手册简单(简单性是有争议的;这里“简单”的意思是“将所有功能保存在一个脚本文件中”)和可测试:
SingleScript.Tests.ps1**

BeforeAll {
    . $PSScriptRoot/SingleScript.ps1 -InTestContext
}

Describe 'SingleScript' {
    Context 'Invoke-Functionality' {
        It 'invokes script functionality' {
            $result = Invoke-Functionality
            $result | Should -Be 'Something useful'
        }
    }
}

在上面的测试文件中,在BeforeAll块中,当使用开关参数InTestContext跳过点源时自动执行。
SingleScript.ps1**

param(
    [switch]
    $InTestContext
)

function Invoke-Functionality {
    'Something useful'
}

if (-not $InTestContext) {
    Invoke-Functionality
}

在上面的脚本文件中,您可以看到允许跳过自动执行的逻辑。

相关问题