1

我很新,Pester所以请多多包涵。我们正在尝试对一个非常大的脚本进行测试,该脚本执行一些活动目录查询并验证数据。我已将其简化为以下示例:

假人.ps1

Param (
    [String]$OU,
    [String[]]$Groups
)

$AllOUusers = Get-ADUser -Filter * -SearchBase $OU

$GroupMemberUsers = foreach ($G in $Groups) {
    Get-ADGroupMember $G -Recursive | Get-ADUser -Properties whenCreated    
}

Dummy.Tests.ps1

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'

$Params = @{
    OU = 'OU=users,DC=contoso,DC=com'
    Groups = 'Group1', 'Group2'
}

Describe 'test' {
    Mock Get-ADGroupMember {
        [PSCustomObject]@{SamAccountName = 'Member1'}
        [PSCustomObject]@{SamAccountName = 'Member2'}
    }
    Mock Get-ADUser {
        [PSCustomObject]@{SamAccountName = 'User1'}
        [PSCustomObject]@{SamAccountName = 'User2'}
        [PSCustomObject]@{SamAccountName = 'User3'}
    }
    Mock Get-ADUser {
        [PSCustomObject]@{SamAccountName = 'User4'}
        [PSCustomObject]@{SamAccountName = 'User5'}
    } -ParameterFilter {$identity -eq 'User1'}

    ."$here\$sut" @Params

    it 'test 1' {
        ($AllOUusers | Measure-Object).Count | Should -BeExactly 3
    }
    it 'test 2' {
        ($GroupMemberUsers | Measure-Object).Count | Should -BeExactly 2
        'User4', 'User5' | Should -BeIn $GroupMemberUsers.SamAccountName
    }
}

错误:

Cannot validate argument on parameter 'Identity'.

在上述情况下,我们首先尝试收集特定 OU 中的所有用户帐户,然后收集特定安全组的所有成员。当我们拥有成员时,我们Get-ADUser再次使用 CmdLet 来获取这些特定成员的更多详细信息。

最终目标是Mock第一个Get-ADUser返回所有用户帐户,第二个MockGet-ADUser返回基于组成员身份(或模拟组成员身份)的一组特定用户帐户。

系统详情

  • PowerShell 5.1
  • 纠缠 4.1.1。
  • 视窗服务器 2012 R1
  • 广告模块 1.0.0.0。

在此处输入图像描述

4

1 回答 1

1

您看到的错误似乎正在发生,因为您在其中创建的用户Mock没有Get-ADGroupMember被 Identity 参数映射/接受,因为它接受管道输入ByValue并需要一个 ADUser 类型的对象。

您可以通过使用New-MockObject创建所需的特定对象类型来解决此问题。这是您的 Mock of 的替代选项Get-ADGroupMember

Mock Get-ADGroupMember {
    1..2 | ForEach-Object {
        $User = New-MockObject -Type Microsoft.ActiveDirectory.Management.ADUser
        $User.SamAccountName = "Member$_"
        $User
    }
}

我使用 aForEach作为一种快速方法来返回您之前返回的 2 个用户,使用您设置的值但作为实际的 ADUser 对象。

然而,这实际上并没有让你-ParameterFilter做第二个Get-ADUser工作。这似乎又是因为 User 是一个对象,但是您将它与字符串进行比较,它不会评估为 true。

一种可能的解决方法(我认为这对您的特定用例有些作用)不是检查特定值,$Identity而只是检查它是否具有任何值:

Mock Get-ADUser {
    [PSCustomObject]@{SamAccountName = 'User4'}
    [PSCustomObject]@{SamAccountName = 'User5'}
} -ParameterFilter { $identity }

这会导致您的 2nd Mock 始终Get-ADUser在您的脚本中被称为 2nd,因为这是唯一一个通过管道传递 Identity 值的模型。这并不完全是您想要实现的目标,但我认为可能会有所帮助。

于 2018-01-16T20:06:30.727 回答