如何在Pester中Mock New-AzStorageContext适配Start-AzStorageBlobCopy
如何Mock New-AzStorageContext以适配Start-AzStorageBlobCopy的DestContext参数
核心思路是避免手动构建不完整的上下文对象,而是通过Mock返回真实AzureStorageContext的最小可行实例,同时配合Mock拦截Start-AzStorageBlobCopy的真实执行,既满足参数类型要求,又能完成测试验证。
具体实现步骤(基于Pester测试框架)
Describe "Blob复制逻辑测试" { BeforeAll { # Mock New-AzStorageContext,返回可被Start-AzStorageBlobCopy接受的上下文实例 Mock New-AzStorageContext { # 使用真实构造函数创建最小上下文对象,无需真实密钥(后续会Mock复制操作) $context = New-Object Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext( [Microsoft.WindowsAzure.Commands.Storage.Common.StorageAccountType]::Standard_LRS, "test-dest-account", "dummy-access-key" ) return $context } -ParameterFilter { $StorageAccountName -eq "test-dest-account" } # Mock Start-AzStorageBlobCopy,避免真实执行复制操作 Mock Start-AzStorageBlobCopy { # 返回模拟的复制状态对象,按需调整属性 return [PSCustomObject]@{ CopyId = "mock-copy-id-001" Status = "Pending" } } } It "应正确传递DestContext并调用复制命令" { # 执行业务逻辑代码示例 $destContext = New-AzStorageContext -StorageAccountName "test-dest-account" -StorageAccountKey "dummy-access-key" Start-AzStorageBlobCopy -SrcBlob "source-file.txt" -SrcContainer "src-container" ` -DestContainer "dest-container" -DestBlob "dest-file.txt" -DestContext $destContext # 验证New-AzStorageContext的调用是否符合预期 Should -Invoke New-AzStorageContext -Exactly 1 -Scope It -ParameterFilter { $StorageAccountName -eq "test-dest-account" } # 验证Start-AzStorageBlobCopy是否接收了正确的DestContext Should -Invoke Start-AzStorageBlobCopy -Exactly 1 -Scope It -ParameterFilter { $DestContext.StorageAccountName -eq "test-dest-account" } } }
为什么之前的方法容易失败
- 用
New-MockObject生成的AzureStorageContext或IStorageContext对象缺少内部关键属性和方法,Start-AzStorageBlobCopy执行时会因对象不完整报错。 - 自定义继承
IStorageContext的类需要实现所有接口方法,不仅工作量大,还容易遗漏PowerShell cmdlet依赖的内部逻辑。
简化替代方案(无需真实构造函数)
如果仅需验证参数传递,无需模拟上下文的内部行为,也可以返回一个伪装成目标类型的PSCustomObject:
Mock New-AzStorageContext { return [PSCustomObject]@{ PSTypeName = "Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext" StorageAccountName = "test-dest-account" EndPoint = "https://test-dest-account.blob.core.windows.net/" } -AsType "Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext" }
内容的提问来源于stack exchange,提问作者Tim Bassett
相关产品推荐
相关产品推荐

