我可以使用Pester模拟/验证没有参数名称的cmdlet吗?

时间:2019-04-10 01:31:37

标签: mocking cmdlets advanced-installer pester

我在Advanced Installer 15.1中使用了几个Powershell脚本,希望使用Pester进行测试。 Advanced Installer提供了两个Cmdlet,以便从Powershell脚本AI_GetMsiProperty and AI_SetMsiProperty访问MSI变量,我想在单元测试中模拟这些变量。问题在于这些cmdlet的标准用法没有指定参数,例如

AI_GetMsiProperty MYPROPERTY
AI_SetMsiProperty MYPROPERTY "Newvalue"

Pester的Mocking功能允许您使用ParameterFilter参数,基于一个命名参数,将多个值返回到同一模拟的多个调用:

>
Mock Get-ChildItem { return @{FullName = "A_File.TXT"} } -ParameterFilter { $Path -and $Path.StartsWith($env:temp\1) }
Mock Get-ChildItem { return @{FullName = "B_File.TXT"} } -ParameterFilter { $Path -and $Path.StartsWith($env:temp\2) }
Mock Get-ChildItem { return @{FullName = "C_File.TXT"} } -ParameterFilter { $Path -and $Path.StartsWith($env:temp\3) }

但是,由于AI_GetMsiProperty不使用命名参数,因此我不确定如何模拟基于参数的多个get或set调用。

Mock AI_GetMsiProperty { return "value1" } -ParameterFilter { ????? }
Mock AI_GetMsiProperty { return "value2" } -ParameterFilter { ????? }

有什么想法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

如果这些命令是正确的PowerShell cmdlet,则应该可以将Get-Help与它们一起使用以确定位置参数名称是什么。但是,如果其他答案不是cmdlet,则无法直接在它们上使用Mock

在这种情况下,可能的解决方法是将命令包装在Function中,然后Mock将此函数包装:

Function Get-MsiProperty ($Property, $Value) {
    AI_GetMsiProperty $Property $Value
}

模拟示例:

Mock Get-MsiProperty -ParameterFilter { $Property -eq 'somevalue' }

答案 1 :(得分:1)

这很可能无法完成,这是因为从我所知道的获取和设置msi属性的角度来看,cmdlet是某种伪cmdlet。更确切地说,它们不是特定于PowerShell语法的cmdlet,而是特定于Advanced Installer语法的,并且它们仅在使用Advanced Installer构建的安装程序包的安装时间内起作用。

如果您尝试在使用Advanced Installer构建的安装包之外运行相关的cmdlet,PowerShell将无法解释它们。