Как создать оболочку для расширенного командлета функции, использующего динамические параметры

Я пытаюсь создать оболочку (прокси) для командлета Should Пестера. Возможные варианты использования включают прозрачное ведение журнала тестовых входных данных даже в случае успеха и улучшить способ ведения журнала Pester объектов определенных типов, например. грамм. hashtable.

Поскольку Should является расширенной функцией, пересылка аргументов через $args splatting не работает.

Итак, я попытался создать оболочку, используя System.Management.Automation.ProxyCommand::Create(), как описано в этом ответе:

$cmd = Get-Command Should
$wrapperSource = [System.Management.Automation.ProxyCommand]::Create( $cmd )
$wrapperSource >should_wrapper.ps1

При вызове оболочки Powershell выводит это сообщение об ошибке:

Должен: набор параметров не может быть разрешен с использованием указанных именованных параметров. Один или несколько выданных параметров не могут использоваться вместе, или было предоставлено недостаточное количество параметров.

Похоже, что генератор оболочки не понимает объявление dynamicparam Should.

Как написать общую оболочку для Should Pester без дублирования кода Pester?


person zett42    schedule 08.01.2021    source источник


Ответы (1)


Похоже, что генератор оболочки не понимает объявление dynamicparam для Should.

Генератор оболочки опускает dynamicparam по умолчанию. К счастью, это легко исправить с помощью шаблонов:

$cmd = Get-Command Should
$pct = [System.Management.Automation.ProxyCommand]
$wrapperSource = @(
  $pct::GetCmdletBindingAttribute($cmd)
  'param('
    $pct::GetParamBlock($cmd)
  ')'
  'dynamicparam {'
    $pct::GetDynamicParam($cmd)
  '}'
  'begin {'
    $pct::GetBegin($cmd)
  '}'
  'process {'
    $pct::GetProcess($cmd)
  '}'
  'end {'
    $pct::GetEnd($cmd)
  '}'
) -join [Environment]::NewLine
person Mathias R. Jessen    schedule 08.01.2021
comment
Опечатка, должно быть param ( ... ). После исправления этого при вызове оболочки, например 0 | .\shouldWrapper.ps1 -Be 1, я получаю следующее сообщение об ошибке: Должен: набор параметров не может быть разрешен с использованием указанных именованных параметров. Один или несколько выданных параметров не могут использоваться вместе, либо было предоставлено недостаточное количество параметров. - person zett42; 08.01.2021
comment
Странный. Какую версию Pester вы используете? У меня это работает с Pester 3.4 в Windows PowerShell 5.1 и с Pester 5 в PowerShell 7.1. - person Mathias R. Jessen; 08.01.2021
comment
Это не удалось с Pester 5.0.4, но работает с Pester 5.1.1 на обеих версиях PS. - person zett42; 08.01.2021
comment
Существует перегрузка ProxyCommand.Create(), имеющая логический параметр generateDynamicParameters, но не имеющая никакого эффекта. Возможно ошибка? - person zett42; 08.01.2021
comment
Это мое впечатление, я никогда не заставлял эту перегрузку работать - отсюда вышивка :-) - person Mathias R. Jessen; 08.01.2021
comment
Отлично сделано. Это действительно ошибка, и стоит отметить, что она влияет только на (расширенные) функции и скрипты, а не на скомпилированные командлеты - см. GitHub issue # 4792; Я добавил комментарий, чтобы указать на обходной путь. / cc @ zett42 - person mklement0; 08.01.2021