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

问题描述 投票:1回答:2

我正在使用几个Powershell脚本和Advanced Installer 15.1,我希望使用Pester进行测试。高级安装程序提供两个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 { ????? }

我有什么想法可以做到这一点?

mocking cmdlets advanced-installer pester
2个回答
1
投票

很可能这不可能完成,这是因为据我所知,提到的get和设置msi属性cmdlet是某种伪cmdlet。更确切地说,它们不是特定于PowerShell语法的cmdlet,而是特定于Advanced Installer语法,它们仅在使用Advanced Installer构建的安装程序包的安装时间内有效。

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


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' }
© www.soinside.com 2019 - 2024. All rights reserved.