我在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 { ????? }
有什么想法可以实现这一目标吗?
答案 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将无法解释它们。