[英]Null List in Pester Mock created from a closure
为什么执行以下代码:
function CreateExecutedCommandsLogger(){
param(
[System.Collections.Generic.List[System.String]]$cmdLog
)
"WWWWW=>{0}" -f $cmdLog | Write-Host
return{
param(
[parameter(valuefrompipeline)]$command
)
"XXXXX=>{0}" -f $command | Write-Host
"YYYYY=>{0}" -f $cmdLog | Write-Host
$cmdLog.Add($command)
}.GetNewClosure()
}
$executedCommands = New-Object System.Collections.Generic.List[System.String]
Mock ExecuteSqlCommand (CreateExecutedCommandsLogger $executedCommands)
导致错误:
RuntimeException: You cannot call a method on a null-valued expression.
at <ScriptBlock>, <No file>: line 7
at <ScriptBlock>, C:\Users\notme\Documents\WindowsPowerShell\Modules\Pester\Functions\Mock.ps1: line 1018
at ExecuteBlock, C:\Users\notme\Documents\WindowsPowerShell\Modules\Pester\Functions\Mock.ps1: line 1022
at Invoke-Mock, C:\Users\notme\Documents\WindowsPowerShell\Modules\Pester\Functions\Mock.ps1: line 868
at <ScriptBlock><Process>, <No file>: line 53
供参考,跟踪输出给出:
WWWWW=>System.Collections.Generic.List`1[System.String]
XXXXX=>C:\dummy\command.exe -S "blah" -d "blahblah" -i "something.sql"
YYYYY=>
当我使用以下内容时,它可以工作:
$dummyMock = (CreateExecutedCommandsLogger $executedCommands)
&$dummyMock "blah"
我假设这与模拟中的脚本块的执行方式有关?
从源代码(Get-Command Mock).ScriptBlock
可以看到,在一行中使用$MockWith
参数:
$mockWithCopy = [scriptblock]::Create($MockWith.ToString())
因此, $MockWith
实际上是一个字符串,任何闭包都将被忽略。 之所以可能这样做是因为在下一行中,新创建的脚本块$mockWithCopy
绑定到某个会话状态,因此无论如何您都会松开闭包:
Set-ScriptBlockScope -ScriptBlock $mockWithCopy -SessionState $contextInfo.Session
Pester首先执行脚本块的私有副本,以不影响传递的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.