Не могу пройти тест Pester из-за ошибки локальной переменной

Мне сложно создать приставку для конкретной функции Powershell с помощью invoke-command и наличия переменной $ using в блоке сценария. Он всегда возвращал ошибку всякий раз, когда я запускаю свой тест. Пример функции и теста ниже:

Функция:

Function Execute-Function {
.
.
.
$Name = "Computer_Name"

$ScriptBlock = {
    Import-Module "Activedirectory"
    Get-Computer -Name $Using:Name
}

Invoke-Command -Session $Session -ScriptBlock $ScriptBlock
}

Тестовое задание:

Describe 'Execute-Function' {
.
.
.
.
mock Import-Module {} -verifiable

mock Get-Computer {} -verifiable

mock Invoke-Command {
 param($Scriptblock)
 . $Scriptblock
} -verifiable


$result = Execute-Function

it 'should call all verifiable mocks'{
 Assert-verifiablemocks
}
}

Ошибка моего теста вернет A using переменная не может быть получена. Переменная using может использоваться только с Invoke-Command .... Я не могу понять эту ошибку, хотя я издевался над Get-Computer, чтобы ничего не вернуть? или мне нужно изменить способ имитации Get-Computer для прохождения теста?

Заранее спасибо


person Alexander Andro Jae Diaz    schedule 10.01.2018    source источник
comment
Возможный обходной путь - использовать старый метод включения блока параметров в блок сценария для передачи аргументов в Invoke-Command со списком аргументов.   -  person Maximilian Burszley    schedule 10.01.2018
comment
Привет, @ TheIncorrigible1, спасибо за ответ. Означает ли это, что мне нужно отредактировать саму функцию? Извините, у меня пока недостаточно знаний для этого.   -  person Alexander Andro Jae Diaz    schedule 10.01.2018
comment
Да, для использования блока параметров потребуется переписать все вызовы Invoke-Command. Invoke-Command { param($myparam) ... } -ArgumentList ...   -  person Maximilian Burszley    schedule 10.01.2018
comment
Вау, спасибо @ TheIncorrigible1, теперь мой тест проходит, и я могу достичь 100% покрытия кода. Вы действительно мне очень помогли. Большое тебе спасибо.   -  person Alexander Andro Jae Diaz    schedule 10.01.2018
comment
Отлично, тогда выложу в качестве ответа.   -  person Maximilian Burszley    schedule 11.01.2018


Ответы (1)


Я не уверен, что вы можете эмулировать осциллограф $using: с помощью Pester. Однако вы можете использовать способ действия до $using:-scope:

Invoke-Command -ScriptBlock {
    Param(
        [Parameter(Position = 0)]
        [String] $Name
    )

    <# ... #>

} -ArgumentList $Name
person Maximilian Burszley    schedule 10.01.2018
comment
Это работает, как ожидалось, и на данный момент является для нас наиболее оптимальным решением. Я пробовал себя программно обойти это, чтобы избежать необходимости изменять производственный код, но безуспешно. Я задокументировал свои попытки в проблеме здесь: github.com/pester/Pester/issues/2015 - person aolszowka; 25.06.2021