#mocking #cmdlets #advanced-installer #pester
#издевательство #powershell-командлет #дополнительно-установщик #pester
Вопрос:
Я использую несколько сценариев Powershell с расширенным установщиком 15.1, которые я хочу протестировать с помощью Pester. Расширенный установщик предоставляет два командлета для доступа к переменным MSI из сценариев Powershell, AI_GetMsiProperty и AI_SetMsiProperty, которые я хотел бы использовать в своих модульных тестах. Проблема в том, что стандартное использование этих командлетов без указания параметров, например
AI_GetMsiProperty MYPROPERTY
AI_SetMsiProperty MYPROPERTY "Newvalue"
Возможности Mocking Pester позволяют использовать ParameterFilter
параметр для возврата нескольких значений нескольким вызовам одного и того же макета на основе именованного параметра:
Mock Get-ChildItem { return @{FullName = "A_File.TXT"} } -ParameterFilter { $Path -and $Path.StartsWith($env:temp1) }
Mock Get-ChildItem { return @{FullName = "B_File.TXT"} } -ParameterFilter { $Path -and $Path.StartsWith($env:temp2) }
Mock Get-ChildItem { return @{FullName = "C_File.TXT"} } -ParameterFilter { $Path -and $Path.StartsWith($env:temp3) }
Однако, поскольку AI_GetMsiProperty не использует именованные параметры, я не уверен, как имитировать несколько вызовов get или set на основе параметров.
Mock AI_GetMsiProperty { return "value1" } -ParameterFilter { ????? }
Mock AI_GetMsiProperty { return "value2" } -ParameterFilter { ????? }
Есть идеи, как я могу это сделать?
Ответ №1:
Скорее всего, это невозможно сделать, и это связано с тем, что, насколько я знаю, упомянутые командлеты get и set msi properties являются своего рода псевдо-командлетами. Точнее, это не командлеты, специфичные для синтаксиса PowerShell, а специфичные для синтаксиса Advanced Installer, и они будут работать только во время установки установочного пакета, созданного с помощью Advanced Installer.
Если вы попытаетесь запустить связанные командлеты вне установочного пакета, созданного с помощью Advanced Installer, PowerShell просто не сможет их интерпретировать.
Ответ №2:
Если эти команды являются настоящими командлетами PowerShell, вы должны иметь возможность использовать Get-Help
их для определения имен позиционных параметров. Однако, если в соответствии с другим ответом они не являются командлетами Mock
, их нельзя использовать напрямую.
Возможным обходным решением в этом случае было бы обернуть команды в a Function
, а затем Mock
в эту функцию:
Function Get-MsiProperty ($Property, $Value) {
AI_GetMsiProperty $Property $Value
}
Пример макета:
Mock Get-MsiProperty -ParameterFilter { $Property -eq 'somevalue' }