管道输入功能

时间:2014-12-08 12:15:23

标签: powershell pester

我有以下用于创建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 ... +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~~ [&lt;&lt; ==&gt;&gt;]异常:输入对象不能   由于命令,绑定到命令的任何参数   不采用管道输入或输入及其属性不   匹配任何采用管道输入的参数。

好的,所以我需要修改我的函数来接受管道输入。我读了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参数设置为允许管道输入: enter image description here 所以我想我需要在我的代理功能中指定相同的功能,但我不知道该怎么做。

1 个答案:

答案 0 :(得分: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 ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~ [&lt;&lt; ==&gt;&gt;]异常:无法转换   'System.Object []'到类型'Microsoft.WindowsAzure.Manag   ement.HDInsight.Cmdlet.DataObjects.AzureHDInsightConfig'需要   参数'Config'。不支持指定的方法。 - &GT;规定   方法不受支持。

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