如何在Pester中模拟具有两个互斥参数的测试

时间:2020-04-02 19:38:52

标签: powershell pester

我正在编写一个辅助函数以登录到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 :(得分:0)

以下作品:

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也是如此)。

所以我们必须在Mock中测试IsNullOrWhitespace并抛出错误。