Имитирующие функции класса с помощью Pester 5 и PowerShell 7

#powershell #pester

#powershell #pester

Вопрос:

Есть ли у кого-нибудь пример издевательства над функцией класса с точечным источником с помощью Pester 5 и PowerShell 7?

Спасибо.

Редактировать: пример

Классы MyClass.ps1:

 class MyClass {
    [void] Run() {
        Write-Host "Class: Invoking run..."
    }
}
 

MyModule.psm1:

 # Import classes
. '.ClassesMyClass.ps1'

# Instantiate classes
$MyClass = [MyClass]::new()

# Call class function
$MyClass.Run()
 

Комментарии:

1. Да, в документах их много . Что-нибудь конкретное , с чем вы боретесь?

2. Эй, да — я могу издеваться над большинством вещей без проблем. Это, в частности, функции, определенные в классе.

3. Функции, определенные в методе класса, по-прежнему являются просто функциями. Вы пытаетесь имитировать метод класса?

4. Да, правильно. Я не согласен с формулировкой. Приведен пример в исходном q.

5. Не беспокойтесь, пример проясняет 🙂

Ответ №1:

Pester издевается только над командами, а не над классами или их методами.

Самый простой способ «имитировать» класс PowerShell для тестирования диспетчеризации методов — воспользоваться тем фактом, что PowerShell помечает все методы virtual , тем самым позволяя производным классам переопределять их:

 class MockedClass : MyClass
{
  Run() { Write-host "Invoking mocked Run()"}
}
 

Приятная особенность этого подхода заключается в том, что функции, ограничивающие ввод MyClass типа, все равно будут работать с насмешливым типом:

 function Invoke-Run
{
  param([MyClass]$Instance)

  $instance.Run()
}

$mocked = [MockedClass]::new()
Invoke-Run -Instance $mocked    # this still works because [MockedClass] derives from [MyClass]
 

Комментарии:

1. Как вы даете Pester знать, что такое MyClass? class MockedClass : MyClass . Прямо сейчас Pester возвращается Unable to find type [MyClass] .

2. @XeonFibre либо добавьте using module ModuleContainingClassDef директиву в файл тестового сценария, либо определите класс, встроенный в Invoke-Expression (т.е. iex 'class MockedClass : ...' )

3. Есть ли шанс, что вы знаете, как использовать Mock… -Можно проверить с помощью вашего решения? Тогда я мог бы убедиться, что вызывается издевательский метод.

4. Мне не очень повезло, но все в порядке, я собираюсь создать несколько интерфейсов и вместо этого пойти по этому пути. Это позволит мне проверить правильность вызова функций, и тесты должны быть короче.