使用和不使用ParameterFilter模拟Get-ADUser

时间:2018-01-16 12:52:29

标签: unit-testing powershell testing pester

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

Dummy.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,并为仅返回特定设置的Mock Get-ADUser提供Dim customer = connection.Query(Of Klantgegevens)("Select Actief,Onderhoudscontract From Klantgegevens Where Klantnummer=@Idx", New With {.Idx = customerId}).SingleOrDefault 基于组成员身份(或模拟组成员身份)的用户帐户。

系统详情

  • PowerShell 5.1
  • Pester 4.1.1。
  • Windows server 2012 R1
  • AD Module 1.0.0.0。

enter image description here

1 个答案:

答案 0 :(得分:1)

您看到的错误似乎正在发生,因为您在Mock Get-ADGroupMember中创建的用户未被Identity参数映射/接受,因为它接受管道输入{ {1}}并期望ADUser类型对象。

您可以使用ByValue创建所需的特定对象类型来解决此问题。这是你的模拟New-MockObject的替代选项:

Get-ADGroupMember

我使用Mock Get-ADGroupMember { 1..2 | ForEach-Object { $User = New-MockObject -Type Microsoft.ActiveDirectory.Management.ADUser $User.SamAccountName = "Member$_" $User } } 作为快速返回之前返回的2个用户的方法,使用您设置的值,但作为实际的ADUser对象。

这实际上并不会使第ForEach-ParameterFilter工作。这似乎又是因为User是一个对象,但是你将它与一个字符串进行比较,它不会被评估为真。

一个可能的解决方法(我认为对您的特定用例有所帮助)不是要检查Get-ADUser的特定值,而只是检查它是否有任何值:

$Identity

这会导致您的第二个Mock始终在脚本中被调用为第二个Mock Get-ADUser { [PSCustomObject]@{SamAccountName = 'User4'} [PSCustomObject]@{SamAccountName = 'User5'} } -ParameterFilter { $identity } ,因为这是唯一一个获取管道身份值的人。这并不是你想要达到的目标,但我认为可能会有所帮助。