You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:43:10