我正在测试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
3条答案
按热度按时间sqserrrh1#
根据评论,问题是你的脚本是自执行的,所以不可能通过点源为Pester加载它而不执行函数。
Roman建议的临时使用
Set-Alias
将main
设置为Out-Null
的解决方法可以工作。另一个建议是将你的函数分离到一个单独的文件中(例如名为functions.ps1
),然后在你的原始脚本中你可以使用点源来包含它,但是在你的测试脚本中只需要点源functions.ps1
文件。t98cgbkg2#
这将只运行主函数,如果它不被称为ny点源,作为一个pester脚本将。我使用这个函数,而不是将函数拆分到另一个不需要它的文件中。然后pester运行而不调用Main函数。
jljoyd4f3#
如果你出于某种原因
一种方法是添加逻辑,该逻辑在提供开关参数时跳过自动执行脚本的功能。
我使用类似的东西来保持我的Azure自动化运行手册简单(简单性是有争议的;这里“简单”的意思是“将所有功能保存在一个脚本文件中”)和可测试:
SingleScript.Tests.ps1**
在上面的测试文件中,在
BeforeAll
块中,当使用开关参数InTestContext
跳过点源时自动执行。SingleScript.ps1**
在上面的脚本文件中,您可以看到允许跳过自动执行的逻辑。