2013-11-11 2 views
4

Используя Pester, я издеваюсь над расширенной функцией, которая включает, помимо других параметров, переключатель. Как создать -parameterFilter для макета, который включает параметр переключателя?Как я могу указать параметрФильтр с параметром переключателя, когда насмехался в Pester?

Я пробовал:

-parameterFilter { $Domain -eq 'MyDomain' -and $Verbose -eq $true } 

-parameterFilter { $Domain -eq 'MyDomain' -and $Verbose } 

-parameterFilter { $Domain -eq 'MyDomain' -and $Verbose -eq 'True' } 

безрезультатно.

+0

Вы принимающий реальное сообщение об ошибке? Существуют проблемы с издевательскими вызовами, когда испытуемый объект импортирован как модуль. Обратите внимание на ограничения, обсуждаемые здесь. Https://github.com/pester/Pester/wiki/Mocking-with-Pester – Kieranties

ответ

0

Следующая, кажется, работает нормально:

Test.ps1 - Это просто содержит две функции. Оба имеют те же параметры, но Test-Call звонки до Mocked-Call. Мы проверим Mocked-Call в наших тестах.

Function Test-Call { 
    param(
     $text, 
     [switch]$switch 
    ) 

    Mocked-Call $text -switch:$switch 
} 

Function Mocked-Call { 
    param(
     $text, 
     [switch]$switch 
    ) 

    $text 
} 

Test.Tests.ps1 - Это наш фактический тестовый скрипт. Обратите внимание, что у нас есть две макетные реализации для Mocked-Call. Первый будет соответствовать, если для параметра switch установлено значение true. Второй будет соответствовать, когда параметр text имеет значение четвертогои параметр switch имеет значение ложной.

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

Describe "Test-Call" { 

    It "mocks switch parms" { 
     Mock Mocked-Call { "mocked" } -parameterFilter { $switch -eq $true } 
     Mock Mocked-Call { "mocked again" } -parameterFilter { $text -eq "fourth" -and $switch -eq $false } 

     $first = Test-Call "first" 
     $first | Should Be "first" 

     $second = Test-Call "second" -switch 
     $second | Should Be "mocked" 

     $third = Test-Call "third" -switch:$true 
     $third | Should Be "mocked" 

     $fourth = Test-Call "fourth" -switch:$false 
     $fourth | Should Be "mocked again" 

    } 
} 

Запуск тестов показывает зеленый:

Describing Test-Call 
[+] mocks switch parms 17ms 
Tests completed in 17ms 
Passed: 1 Failed: 0 
3

Попробуйте это:

-parameterFilter { $Domain -eq 'MyDomain' -and $Verbose.IsPresent} 
1

-Verbose является общим параметром, который делает это немного сложнее. Вы никогда не видите переменную $Verbose в своей функции, и то же самое относится к фильтру параметров. Вместо этого, когда кто-то устанавливает общий переключатель -Verbose, что на самом деле происходит, переменная $VerbosePreference получает значение Continue вместо SilentlyContinue.

Вы можете, однако, найти Verbose переключателя в автоматической переменной $PSBoundParameters, и вы должны быть в состоянии использовать это в вашем макете фильтра:

Mock someFunction -parameterFilter { $Domain -eq 'MyDomain' -and $PSBoundParameters['Verbose'] -eq $true }