我对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
基于组成员身份(或模拟组成员身份)的用户帐户。
系统详情
答案 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 }
,因为这是唯一一个获取管道身份值的人。这并不是你想要达到的目标,但我认为可能会有所帮助。