1

我有以下用于创建 HDInsight 群集的工作代码:

New-AzureHDInsightClusterConfig    -ClusterSizeInNodes $ClusterNodes  `
                                                -VirtualNetworkId ($VNet.Id)       `
                                                -SubnetName $subnetName            `
                                                -ClusterType $ClusterType |        `
                    Set-AzureHDInsightDefaultStorage   -StorageAccountName        "$StorageAccountName.blob.core.windows.net"  `
                                                            -StorageAccountKey         $StorageAccountKey                           `
                                                            -StorageContainerName      $StorageContainerName |                      `
                    New-AzureHDInsightCluster          -Credential                $ClusterCreds                                `
                                                            -Location                  $Location                                    `
                                                            -Name                      $ClusterName                                 `
                                                            -Version                   $HDInsightVersion

请注意,我正在使用流水线。现在我想编写一些自动化测试(使用Pester)来测试这段代码。为了做到这一点,我将 cmdlet 调用包装在我称之为代理函数的地方,并使用 splatting 传递参数值,这使得为了测试目的而模拟它们变得容易。这是一个例子:

function Set-AzureHDInsightDefaultStorageProxy{
<#
    .SYNOPSIS 
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
    .DESCRIPTION
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
#>
    [CmdletBinding()]
    Param(
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage @PSBoundParameters
}
New-AzureHDInsightClusterConfigProxy    -ClusterSizeInNodes $ClusterNodes  `
                                                -VirtualNetworkId ($VNet.Id)       `
                                                -SubnetName $subnetName            `
                                                -ClusterType $ClusterType |        `
                    Set-AzureHDInsightDefaultStorageProxy   -StorageAccountName        "$StorageAccountName.blob.core.windows.net"  `
                                                            -StorageAccountKey         $StorageAccountKey                           `
                                                            -StorageContainerName      $StorageContainerName |                      `
                    New-AzureHDInsightClusterProxy          -Credential                $ClusterCreds                                `
                                                            -Location                  $Location                                    `
                                                            -Name                      $ClusterName                                 `
                                                            -Version                   $HDInsightVersion

当我尝试运行此代码时,出现错误:

Set-AzureHDInsightDefaultStorageProxy -StorageAccountName ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ [<<==>>] 例外:输入对象不能绑定到命令的任何参数,因为命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数都不匹配。

好的,所以我需要修改我的函数以接受管道输入。我阅读了Write PowerShell Functions That Accept Pipelined Input并基于此我将代理函数重写为:

function Set-AzureHDInsightDefaultStorageProxy{
    [CmdletBinding()]
    Param(
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage -Config $input -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -StorageContainerName $StorageContainerName
}

但同样的错误失败了。

显然,我缺乏 Powershell 技能/知识让我失望,所以我希望有人能告诉我如何重写我的函数以成功接受和使用管道输入。

这是我正在为其编写代理函数的 cmdlet 的定义:Set-AzureHDInsightDefaultStorage。我注意到 -Config 参数设置为允许管道输入: 在此处输入图像描述 所以我想我需要在代理函数中指定相同的参数,但我不知道该怎么做。

4

1 回答 1

1

好的,我想我已经想通了:

function Set-AzureHDInsightDefaultStorageProxy{
<#
    .SYNOPSIS 
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
    .DESCRIPTION
      Wrap Azure cmdlet Set-AzureHDInsightDefaultStorage thus enabling mocking
#>
    [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline=$true)]$Config,
        $StorageAccountName,
        $StorageAccountKey,
        $StorageContainerName
    )
    Set-AzureHDInsightDefaultStorage -Config $input -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -StorageContainerName $StorageContainerName
}

它仍然无法按我的意愿工作,因为我没有从管道中的前一个 cmdlet 传递正确的值,所以我收到了一个错误:

错误:08/12/2014 12:19:55:在 E:\DeployUtilities.psm1:984 char:21 + Set-AzureHDInsightDefaultStorageProxy -StorageAccountName
... + ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ [<<==>>] 异常:无法将“System.Object[]”转换为“Microsoft.WindowsAzure.Management.HDInsight.Cmdlet.DataObjects”类型参数 'Config' 需要 .AzureHDInsightConfig'。不支持指定的方法。--> 不支持指定的方法。

但这是一个不同的(不言自明的)问题,我现在将努力解决!

于 2014-12-08T12:22:14.683 回答