Могу ли я использовать Pester для проверки / проверки командлетов без имен параметров?

#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' }