0

我有一个简单的,此时不做任何事情,我才刚刚开始使用 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 读取参数等的方式的问题?

4

1 回答 1

1

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" }
    }
}

编辑: 您也可以使用自动转换到左侧参数,但这会使代码更容易中断:

 ([string[]]$members -contains "dale") -and ("dale" -eq $identity)
于 2015-10-14T20:12:45.470 回答