没有调用 ParameterFilter 的模拟(Pester)

Mock with ParameterFilter Not Being Called (Pester)

我有一个字符串数组 $ServerNames,它包含两个元素:'ServerName1' 和 'ServerName2'。然后我有一个相应的模拟:

Mock 'Get-ADComputer' { $Server1; write-host 'test'}    
Mock 'Get-ADComputer' { $foo } -ParameterFilter { $Identity -eq "$(${server_names}[0])" }

没有过滤器的模拟被调用。有过滤器的那个没有。如果我删除无过滤器模拟,实际上会调用 Get-ADComputer commandlet。为什么过滤后的模拟不启动?

F.Y.I.,我尝试了 $server_names[0] 而不是将它们插入字符串中。

所以这里发生了一些事情。

  1. Identity参数输入为Microsoft.ActiveDirectory.Management.ADComputer

  2. PowerShell 中的比较尝试转换不能直接比较的对象。这是从左到右完成的。

  3. 两个 ADComputer 对象之间的比较仅检查它们是否确实是同一对象。两个单独创建的对象(即使具有相同的条件)将不会显示为相等。

简单的解决方法就是反转比较

'ServerName' -eq $Identity

这样 $Identity 被转换为字符串,而不是字符串被转换为 ADComputer 对象。