我正在尝试找出如何对缺少的参数进行 Pester 测试:
查找 Waldo.Tests.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
Describe 'Mandatory paramters' {
it 'ComputerName' {
{
$Params = @{
#ComputerName = 'MyPc'
ScriptName = 'Test'
}
. "$here\$sut" @Params
} | Should throw
}
}
查找-Waldo.ps1
Param (
[Parameter(Mandatory)]
[String]$ComputerName,
[String]$ScriptName
)
Function Find-Waldo {
[CmdletBinding()]
Param (
[String]$FilePath
)
'Do something'
}
每次我尝试assert
结果或只是运行测试,它会提示我输入ComputerName
参数而不是测试失败。
我在这里错过了一些非常明显的东西吗?有没有办法测试强制参数是否存在?
根据 Mathias 的评论,您无法真正测试是否缺少强制参数,因为 PowerShell 会提示输入而不是抛出错误。根据他从 Pester 团队链接到的评论 https://github.com/PowerShell/PowerShell/issues/2408#issuecomment-251140889你可以用Get-Command
测试脚本中的强制参数设置(假设它是该变量设置的唯一参数属性)
((Get-Command "$here\$sut").Parameters['ComputerName'].Attributes.Mandatory | Should Be $true
另一种选择是在这种情况下不使用强制参数,而是使用一个执行以下操作的脚本块:Throw
作为参数的默认值:
Param (
[String]$ComputerName = $(Throw '-ComputerName is required'),
[String]$ScriptName
)
如果脚本始终用作自动化流程的一部分(而不是通过用户执行),这可能是首选,因为它允许您控制/捕获其行为并避免其在执行过程中卡住。然后您可以按照最初的建议测试脚本:
Describe 'Mandatory paramters' {
it 'ComputerName' {
{
$Params = @{
#ComputerName = 'MyPc'
ScriptName = 'Test'
}
. "$here\$sut" @Params
} | Should throw '-ComputerName is required'
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)