#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. Мне не очень повезло, но все в порядке, я собираюсь создать несколько интерфейсов и вместо этого пойти по этому пути. Это позволит мне проверить правильность вызова функций, и тесты должны быть короче.