【发布时间】:2021-09-17 01:42:28
【问题描述】:
我正在使用 Pester 测试库(5.0.2 版)来测试我的 PowerShell 脚本(5.1 版)并模拟它的依赖项。
Pester 有一个Mock 方法,可用于模拟依赖项。更多信息here。
我正在尝试创建一个包装此 Mock 方法的辅助方法,以使我的代码更具可读性:
Function MockVstsInput {
Param(
[Parameter(Mandatory=$true, Position=1)]
[string]$inputName,
[Parameter(Mandatory=$true, Position=2)]
[string]$returnValue
)
Mock Get-VstsInput {return $returnValue} -ParameterFilter { $Name -eq $inputName}
}
在这个辅助方法中,我模拟了依赖Get-VstsInput,它有一个参数$Name
然后我在我的测试脚本中使用这段代码:
MockVstsInput "targetapi" "api-name"
这意味着如果 Get-VstsInput 使用 $Name 参数“targetapi”调用,那么它应该返回“api-name”。通常这种参数化在其他语言中也有效(例如:C# 或 Java),但这里的 $inputName 字符串在 MockVstsInput 方法中没有解析。
当我在生产代码中调用Get-VstsInput 方法时:
$newapi=Get-VstsInput -Name targetapi
然后在日志中我有以下Mock信息:
Mock: Running mock filter { $Name -eq $inputName } with context: Name = targetapi.
Mock: Mock filter did not pass.
我们可以看到 $inputName 字符串在我的脚本块中没有解析,所以模拟不会发生。
到目前为止我已经尝试过,但没有成功:
-
在谓词脚本块
{ $inputName -eq $Name}中交换相等比较的成员 -
在脚本块中使用
$ExecutionContext.InvokeCommand.ExpandString($inputName)来解析$inputName字符串 -
使用
[ScriptBlock]::create($Name -eq $inputName)创建一个脚本块,然后在-ParameterFilter中使用它 -
最后但同样重要的是,我尝试调用我的脚本块的
GetNewClosure,但它也没有帮助:{ $Name -eq $inputName}.GetNewClosure()
您认为我的问题的根本原因是什么?提前感谢所有帮助!
【问题讨论】:
标签: powershell pester