纠缠 CallHistory 中的 BoundParams 为空
Pester BoundParams in CallHistory empty
我有一个简单的,此时不执行任何操作,我刚刚开始使用 Pester,但我的目标是模拟 Remove-ADGroupMember 和其他一些 AD powershell 命令以进行测试。
Param(
[string]$computerList = ".\computers.csv",
[boolean]$isTest = $false
)
function Remove-Groups(){
Remove-ADGroupMember -Identity "dale" -Members "dale","cameron"
}
和我的测试脚本
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = "../" + (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here$sut"
Describe "UninstallUnused - Remove-Groups" {
It "does something useful" {
Mock Remove-ADGroupMember
Remove-Groups
Assert-MockCalled Remove-ADGroupMember -Exactly 1
Assert-MockCalled Remove-ADGroupMember 1 -ParameterFilter {$Identity -eq "dale" -and $Members -contains "dale"}
}
}
第一个 Assert-MockCalled
行有效,但无论我在第二行上尝试什么,测试总是失败。过了一会儿,我用调试器深入研究了 Assert-MockCalled 函数,看起来 -Members 参数的值丢失了
在上图中,我在 Mock.ps1 的 Assert-MockCalled 函数中,如您所见,传递给成员的值丢失了。如果我只将 1 个值传递给 Remove-ADGroupMember 模拟,如下所示:Remove-ADGroupMember -Identity "dale" -Members "dale"
我在 BoundParams 中看到的值是 {}
而不是 {, }
,如您在屏幕截图中看到的那样。
这是我这样做的方式的问题还是纠缠者从 Remove-ADGroupMember 读取参数等的方式的问题?
Identity 和 Members 参数都属于字符串类型,因此您的断言不起作用。
- 身份 - Microsoft.ActiveDirectory.Management.ADGroup
- 成员 - Microsoft.ActiveDirectory.Management.ADPrincipal[]
因此,为了使过滤器正常工作,您需要转换为字符串(幸运的是,类型序列化为您需要的名称)
function Remove-Groups(){
Remove-ADGroupMember -Identity "dale" -Members "dale","cameron"
}
Describe "UninstallUnused - Remove-Groups" {
It "does something useful" {
Mock Remove-ADGroupMember
Remove-Groups
Assert-MockCalled Remove-ADGroupMember -Exactly 1
Assert-MockCalled Remove-ADGroupMember 1 -ParameterFilter {
Write-Host ( $identity.GetType(),$members.GetType()) ; #otputting the data types
([string[]]$members) -contains "dale" -and ([string]$identity) -eq "dale" }
}
}
编辑:
您也可以使用自动转换为 left 参数,但这会使代码更容易破解:
([string[]]$members -contains "dale") -and ("dale" -eq $identity)
我有一个简单的,此时不执行任何操作,我刚刚开始使用 Pester,但我的目标是模拟 Remove-ADGroupMember 和其他一些 AD powershell 命令以进行测试。
Param(
[string]$computerList = ".\computers.csv",
[boolean]$isTest = $false
)
function Remove-Groups(){
Remove-ADGroupMember -Identity "dale" -Members "dale","cameron"
}
和我的测试脚本
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = "../" + (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here$sut"
Describe "UninstallUnused - Remove-Groups" {
It "does something useful" {
Mock Remove-ADGroupMember
Remove-Groups
Assert-MockCalled Remove-ADGroupMember -Exactly 1
Assert-MockCalled Remove-ADGroupMember 1 -ParameterFilter {$Identity -eq "dale" -and $Members -contains "dale"}
}
}
第一个 Assert-MockCalled
行有效,但无论我在第二行上尝试什么,测试总是失败。过了一会儿,我用调试器深入研究了 Assert-MockCalled 函数,看起来 -Members 参数的值丢失了
在上图中,我在 Mock.ps1 的 Assert-MockCalled 函数中,如您所见,传递给成员的值丢失了。如果我只将 1 个值传递给 Remove-ADGroupMember 模拟,如下所示:Remove-ADGroupMember -Identity "dale" -Members "dale"
我在 BoundParams 中看到的值是 {}
而不是 {, }
,如您在屏幕截图中看到的那样。
这是我这样做的方式的问题还是纠缠者从 Remove-ADGroupMember 读取参数等的方式的问题?
Identity 和 Members 参数都属于字符串类型,因此您的断言不起作用。
- 身份 - Microsoft.ActiveDirectory.Management.ADGroup
- 成员 - Microsoft.ActiveDirectory.Management.ADPrincipal[]
因此,为了使过滤器正常工作,您需要转换为字符串(幸运的是,类型序列化为您需要的名称)
function Remove-Groups(){
Remove-ADGroupMember -Identity "dale" -Members "dale","cameron"
}
Describe "UninstallUnused - Remove-Groups" {
It "does something useful" {
Mock Remove-ADGroupMember
Remove-Groups
Assert-MockCalled Remove-ADGroupMember -Exactly 1
Assert-MockCalled Remove-ADGroupMember 1 -ParameterFilter {
Write-Host ( $identity.GetType(),$members.GetType()) ; #otputting the data types
([string[]]$members) -contains "dale" -and ([string]$identity) -eq "dale" }
}
}
编辑: 您也可以使用自动转换为 left 参数,但这会使代码更容易破解:
([string[]]$members -contains "dale") -and ("dale" -eq $identity)