Powershell 如何测试已解析的参数集?

Powershell 如何测试已解析的参数集?,powershell,pester,Powershell,Pester,我正在尝试编写一个基本的Pester测试,用于检查已解析参数集的“高级”函数: function Do-Stuff { [CmdletBinding(DefaultParameterSetName='Set 1')] [OutputType([String])] Param ( [Parameter(ParameterSetName='Set 1')] [switch] $S1, [Parame

我正在尝试编写一个基本的Pester测试,用于检查已解析参数集的“高级”函数:

function Do-Stuff
{
    [CmdletBinding(DefaultParameterSetName='Set 1')]
    [OutputType([String])]

    Param
    (
        [Parameter(ParameterSetName='Set 1')] 
        [switch]
        $S1,

        [Parameter(ParameterSetName='Set 2')]
        [switch]
        $S2
    )

    $PSBoundParameters |select -ExpandProperty Keys
}

Describe Do-Stuff {
    It 'Returns "S2" when switch "S2" is set' {
        $actual = Do-Stuff -S2 
        $expexted = 'S2'
        $actual |Should Be $expexted
    }

    # How to test the resolved parameter set?
    It 'The resolved parameter set is "Set 2" when switch "S2" is set' { 
        $actual = 'What to do here?' # I'm lost ;(
        $expexted = 'Set 2'
        $actual |Should Be $expexted
    }
}
塔克斯。任何建议都将被高度赞赏,因为我是一个全新的纠缠。。。一般来说,在豪华和编码方面也没有太大的改进:D

使用如下:

Function Main{
  [CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")]
Param(

[Parameter(ParameterSetName="ViewOnly")]
   [switch]$ViewOnly,

[Parameter(ParameterSetName="NukeAll")]
 [switch]$NukeAll
)

Switch ($PSCmdlet.ParameterSetName){
 "NukeAll"{
NukeAll
 }#end nuke all
"ViewOnly"{
ViewOnly
}#end viewonly
  }#end Switch

Function NukeAll {
  #Do NukeAll function code here.
 }

Function ViewOnly{
  #Do ViewOnly function code here.
 }
使用方法如下:

Function Main{
  [CmdletBinding(SupportsShouldProcess=$true,DefaultParameterSetName="ViewOnly")]
Param(

[Parameter(ParameterSetName="ViewOnly")]
   [switch]$ViewOnly,

[Parameter(ParameterSetName="NukeAll")]
 [switch]$NukeAll
)

Switch ($PSCmdlet.ParameterSetName){
 "NukeAll"{
NukeAll
 }#end nuke all
"ViewOnly"{
ViewOnly
}#end viewonly
  }#end Switch

Function NukeAll {
  #Do NukeAll function code here.
 }

Function ViewOnly{
  #Do ViewOnly function code here.
 }
你会用这个

-Name
参数将设置为
参数bindercontroller

作为一种开始的方式,尝试这样的方法(在pester之外)

-PSHost
选项将输出发送到主机,以便您查看

您可能不希望在Pester测试中使用它,而尝试其他侦听器选项和捕获输出的方法。

您将使用它

-Name
参数将设置为
参数bindercontroller

作为一种开始的方式,尝试这样的方法(在pester之外)

-PSHost
选项将输出发送到主机,以便您查看


您可能不希望在Pester测试中使用该选项,而尝试其他侦听器选项和捕获输出的方法。

以下将测试您是否对参数S2使用“Set 2”:

Describe Do-Stuff {
    $Command = Get-Command 'Do-Stuff'

    It 'Returns "S2" when switch "S2" is set' {
        $actual = Do-Stuff -S2 
        $expexted = 'S2'
        $actual |Should Be $expexted
    }

# How to test the resolved parameter set?
    It 'The resolved parameter set is "Set 2" when switch "S2" is set' { 
        $actual = $Command.Parameters["S2"].ParameterSets.Keys
        $expexted = 'Set 2'
        $actual |Should Be $expexted
        # when you use several sets for parameters
        $expexted -contains $actual | should Be $true
   }
}


跟踪powershell是否实际执行了“设置2”,当您将其设置为“设置2”时,它不是纠缠测试的主题。以下将测试您是否对参数S2使用了“设置2”:

Describe Do-Stuff {
    $Command = Get-Command 'Do-Stuff'

    It 'Returns "S2" when switch "S2" is set' {
        $actual = Do-Stuff -S2 
        $expexted = 'S2'
        $actual |Should Be $expexted
    }

# How to test the resolved parameter set?
    It 'The resolved parameter set is "Set 2" when switch "S2" is set' { 
        $actual = $Command.Parameters["S2"].ParameterSets.Keys
        $expexted = 'Set 2'
        $actual |Should Be $expexted
        # when you use several sets for parameters
        $expexted -contains $actual | should Be $true
   }
}


跟踪powershell是否实际执行了“set 2”,当您将其设置为“set 2”时,它不是纠缠测试的主题,因此…

更新了答案以使用
ParameterBinderController
而不是
ParameterBinding
,因为这样更容易看到参数集名称。thanx。这是我无法想象的:D我想知道是否有一些简单且相对优雅的解决方案。最近一直在玩posh——尝试为cmd应用程序制作“包装器”,并为其制作json rpc客户端,两者都有将近50多个参数/选项/方法。另外我还想看看pester@JaquelineVanek我想这对你有用。如果您正在编写纠缠测试,那么
Trace命令
不是您的能力范围。我真的很想看到一个纠缠测试;我认为这将非常有用。@briantist您是否找到了一种方法来获取
Trace命令
,以返回一个描述您可以查询的参数绑定的对象?然后您可以只编写
$traceCommandOutput.ParameterSetName |应该是'desiredParameterSetName'
。似乎这种能力应该存在于某处…@alx9r我还没试过。可能会删除
-PSHost
并查看不同的输出选项?更新了答案,以使用
参数绑定控制器
而不是
参数绑定
,因为这样更容易查看参数集名称。thanx。这是我无法想象的:D我想知道是否有一些简单且相对优雅的解决方案。最近一直在玩posh——尝试为cmd应用程序制作“包装器”,并为其制作json rpc客户端,两者都有将近50多个参数/选项/方法。另外我还想看看pester@JaquelineVanek我想这对你有用。如果您正在编写纠缠测试,那么
Trace命令
不是您的能力范围。我真的很想看到一个纠缠测试;我认为这将非常有用。@briantist您是否找到了一种方法来获取
Trace命令
,以返回一个描述您可以查询的参数绑定的对象?然后您可以只编写
$traceCommandOutput.ParameterSetName |应该是'desiredParameterSetName'
。似乎这种能力应该存在于某处…@alx9r我还没试过。也许可以删除
-PSHost
并查看不同的输出选项?我想你还没有找到我。真糟糕,对不起,别以为你抓住我了。真糟糕,对不起