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

Я использую несколько сценариев Powershell с Advanced Installer 15.1, которые я хочу протестировать с помощью Pester. Расширенный установщик предоставляет два командлета для доступа к переменным MSI из сценариев Powershell, AI_GetMsiProperty и AI_SetMsiProperty, которые я хотел бы смоделировать в своих модульных тестах. Проблема в том, что стандартное использование этих командлетов без указания параметров, например.

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 { ????? }

Любые идеи, как я могу это сделать?


person pghprogrammer4    schedule 10.04.2019    source источник


Ответы (2)


Скорее всего, это невозможно сделать, потому что, насколько я знаю, упомянутые командлеты свойств get и set msi являются своего рода псевдокомандлетами. Точнее, это не командлеты, специфичные для синтаксиса PowerShell, а специфичные для синтаксиса расширенного установщика, и они будут работать только во время установки пакета установки, созданного с помощью расширенного установщика.

Если вы попытаетесь запустить соответствующие командлеты за пределами установочного пакета, созданного с помощью расширенного установщика, PowerShell просто не сможет их интерпретировать.

person herman.smn    schedule 10.04.2019

Если эти команды являются настоящими командлетами PowerShell, вы сможете использовать с ними Get-Help, чтобы определить имена позиционных параметров. Однако, если в соответствии с другим ответом они не являются командлетами, то Mock нельзя использовать для них напрямую.

Возможным обходным решением в этом случае было бы обернуть команды в Function, а затем Mock вместо этой функции:

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

Макетный пример:

Mock Get-MsiProperty -ParameterFilter { $Property -eq 'somevalue' }
person Mark Wragg    schedule 10.04.2019