簡體   English   中英

從關閉創建的Pester Mock中的空列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM