簡體   English   中英

如何在Pester中模擬Azure PowerShell Cmdlet?

[英]How to mock Azure PowerShell Cmdlets in Pester?

因此,我一直在嘗試對Azure部署腳本進行單元測試,而無法模擬Azure cmdlet。 即使有適當的模擬,它們也會在測試期間執行。

這是我的PowerShell版本。

Name                           Value
----                           -----
PSVersion                      5.1.16299.1146
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.1146
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

即時通訊上的Pester版本4.8.1。

這就是我試圖開始工作的實際代碼。 首先功能:

function CleanUp-Resources {
    Set-AzContext $DeploymentSubscriptionName | Out-Null
    $resGroup = Get-AzResourceGroup -Name $script:devtestlabRGName -ErrorAction SilentlyContinue
    if (!$resGroup) {
        $Global:Error.RemoveAt(0)
    }
    else {
        Write-SitAzLog "Removing resource group and all generated resources"
        Remove-SitAzRGWithLocks $resGroup.ResourceGroupName
    }
}

如您所見,刪除resourceGroup(如果存在)只是一個簡單的功能。

現在測試代碼:

Describe "CleanUp-Resources" -Tags "Disabled", "Unit"{
    Mock Write-SitAzLog {} 
    Mock Set-AzContext {} 


    Context "res group not found" {
        $cnt = $Error.Count
        Mock Get-AzResourceGroup {
            throw "Not found"
        }
        It "deletes the error message from count" {
            CleanUp-Resources
            Assert-MockCalled Get-AzResourceGroup 
            $Error.Count | Should Be $cnt
        }
    }
}

因此,我對模擬的理解是,這應該阻止實際的Set-AzContext函數運行,因為它是使用空腳本塊進行模擬的。 但是不幸的是,Set-AzContext引發了一個錯誤,即參數context的值為null,這表明它正在嘗試執行常規cmdlet。 從其他模塊模擬cmdlet效果很好,所以我猜想它特別與Azure模塊有關。

請輸入任何反饋意見。

對我來說,可行的解決方案是向模擬命令提供一些(模擬)輸入-如果沒有輸入,模擬就不會被擊中。

碼:

    $subscription = Get-AzSubscription -SubscriptionId 'xyz'
if ($null -ne $subscription) {
    Set-AzContext -SubscriptionObject $subscription | Out-Null
}

嘲笑:

Mock Get-AzSubscription -ParameterFilter {$SubscriptionId -eq 'xyz'}{
    return New-Object Microsoft.Azure.Commands.Profile.Models.PSAzureSubscription
}
Mock Set-AzContext

在這種情況下,兩個模擬都被擊中。 如果沒有從Get-AzSubscription返回對象,則不會命中Set-AzContext模擬,並且aster會返回錯誤。

我必須使用-ModuleName參數為Mock添加調用模塊名稱:

Mock New-AzADApplication {
  @{
    ObjectID      = New-Guid
    ApplicationID = New-Guid
  }
} -ModuleName MyModule

Mock New-AzADAppCredential {$true} -ModuleName MyModule

Mock New-AzADServicePrincipal {$true} -ModuleName MyModule

Mock Read-Host {ConvertTo-SecureString -String 'Password' -AsPlainText -Force} -ModuleName MyModule

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM