Как макетировать тест с двумя взаимоисключающими параметрами в Пестере - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу вспомогательную функцию для входа в систему Azure. Я могу позвонить Connect-AzAccount с -SubscriptionId или -SubscriptionName, но не обоими. Я пытался ...

Mock Connect-AzAccount { return @{Name = 'Fake Name'} } -ParameterFilter { $SubscriptionId } -Verifiable
Assert-LoginAzureAz -SubscriptionName '0123'

Я пытался ...

Mock Connect-AzAccount { return @{Name = 'Fake Name'} } -ParameterFilter { '0123' -eq $SubscriptionId } -Verifiable
Assert-LoginAzureAz -SubscriptionName '0123'

Я пытался ...

Mock Connect-AzAccount { return @{Name = 'Fake Name'} } -ParameterFilter { $null -eq $SubscriptionId } -Verifiable
Assert-LoginAzureAz -SubscriptionName '0123'

Но все это проходит , Нужно ли создавать два макета? Как я могу утверждать, что отрицательный не был вызван? Могу ли я использовать Assert-MockCalled с двумя разными Mocks?

РЕДАКТИРОВАТЬ: Добавление других тестов, которые я пробовал ...

Mock Connect-AzAccount { throw 'Called Connect-AzAccount by SubscriptionName' } -ParameterFilter { $SubscriptionName }
Mock Connect-AzAccount { return @{Name = 'Fake Name'} } -ParameterFilter { $SubscriptionId } -Verifiable

Assert-LoginAzureAz -SubscriptionName '0123'

Все еще проходит.

1 Ответ

0 голосов
/ 03 апреля 2020

Следующие работы:

Mock Connect-AzAccount { if([string]::IsNullOrWhitespace($SubscriptionId)) {throw 'Called Connect-AzAccount by SubscriptionName'} else {return @{Name = 'Fake Name'}} } -ParameterFilter { $null -ne $SubscriptionId } -Verifiable

Assert-LoginAzureAz -SubscriptionId '0123'  ### Passes
Assert-LoginAzureAz -SubscriptionName '0123'  ### Fails

Сброс Mocks не очень хорошая идея (я даже не уверен, что это поддерживается). И поскольку это параметр, PS запускает их со значением String.Empty (да, даже если вы установите значение по умолчанию [string] $SubscriptionId = [NullString]::Value).

Поэтому мы должны проверить IsNullOrWhitespace в Mock и выдать ошибку .

...