Как я могу использовать Pester для макета командлета, в котором модуль недоступен? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь написать тесты Пестера для моих модулей Runbook автоматизации Azure. Сценарий runbook использует командлет Get-AutomationVariable, и я пытаюсь смоделировать его с помощью:

mock 'Get-AutomationVariable' {return "localhost:44300"} -ParameterFilter { $name -eq "host"}

, что приводит к ошибке

CommandNotFoundException: термин «Get-AutomationVariable» не является распознается как имя командлета, функции, файла сценария или работоспособного программа.

Проверьте правильность написания имени или, если путь был включен, проверьте правильность пути и повторите попытку.

Использование параметра -ModuleName не представляется целесообразным, поскольку я вызываю метод из сценария, а не из модуля. Попытка предоставить модуль-заглушку приводит к той же самой ошибке, выдаваемой.

. "$here\$sut" "CN=teset, OU=Test" "CN=SubCA02, OU=Test"

Get-Module -Name RunbookMock | Remove-Module
New-Module -Name RunbookMock -ScriptBlock {
  function Get-AutomationVariable {
    [CmdLetBinding()]
    param(
      [string]$Name
    )

    ""
  }
  Export-ModuleMember Get-AutomationVariable
} | Import-Module -Force

describe 'Pin-Certificate' {
  it 'should add an entry to the pinned certificate list'{
    mock 'Get-AutomationVariable' { return "sastoken"} -ParameterFilter {  $Name -eq "StorageSasToken"} -
    mock 'Get-AutomationVariable' {return "localhost:44300"} -ParameterFilter { $name -eq "host"}
  }
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Согласно комментариям, ваш код должен работать. В прошлом я только что объявил пустую функцию, а не полный модуль. Например:

function MyScript {
    Get-FakeFunction
}

Describe 'Some Tests' {

    function Get-Fakefunction {}

    Mock 'Get-Fakefunction' { write-output 'someresult' }

    $Result = MyScript

    it 'should invoke Get-FakeFunction'{
        Assert-MockCalled 'Get-Fakefunction' -Times 1              
    }
    it 'should return someresult'{
        $Result | Should -Be 'someresult'
    }
}
0 голосов
/ 04 мая 2018

Основными вопросами были последовательность заявлений. Тестируемый сценарий был поставлен до объявления макета. Переупорядочив операторы так, чтобы они объявляли макеты, а затем исходный код, сценарий решил проблему, и отличное предложение от @MarkWragg помогло еще больше упростить код. Его окончательное рабочее состояние выглядит следующим образом.

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'

  function Get-AutomationVariable {
    [CmdLetBinding()]
    param([string]$Name)
  }

describe 'Pin-Certificate' {
  it 'should add an entry to the pinned certificate list' {
    mock 'Get-AutomationVariable' -MockWith { "sastoken" } -ParameterFilter {  $Name -eq "StorageSasToken"}
    mock 'Get-AutomationVariable' -MockWith { "localhost:44300" } -ParameterFilter { $Name -eq "host"}
    mock 'Invoke-WebRequest' -MockWith { @{ "StatusCode" = "204"; }   }

    # dot source the sut, invoking the default function
    $result = (. "$here\$sut" "Subject" "Issuer" "Thumbprint")

    $result.Issuer | Should be "Issuer"
    $result.Subject | Should Be "Subject"
    $result.Thumbprint | Should Be "Thumbprint"
  }
...