没有调用 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] 而不是将它们插入字符串中。
所以这里发生了一些事情。
Identity
参数输入为Microsoft.ActiveDirectory.Management.ADComputer
PowerShell 中的比较尝试转换不能直接比较的对象。这是从左到右完成的。
两个 ADComputer
对象之间的比较仅检查它们是否确实是同一对象。两个单独创建的对象(即使具有相同的条件)将不会显示为相等。
简单的解决方法就是反转比较
'ServerName' -eq $Identity
这样 $Identity
被转换为字符串,而不是字符串被转换为 ADComputer
对象。
我有一个字符串数组 $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] 而不是将它们插入字符串中。
所以这里发生了一些事情。
Identity
参数输入为Microsoft.ActiveDirectory.Management.ADComputer
PowerShell 中的比较尝试转换不能直接比较的对象。这是从左到右完成的。
两个
ADComputer
对象之间的比较仅检查它们是否确实是同一对象。两个单独创建的对象(即使具有相同的条件)将不会显示为相等。
简单的解决方法就是反转比较
'ServerName' -eq $Identity
这样 $Identity
被转换为字符串,而不是字符串被转换为 ADComputer
对象。