2015-10-09 20 views
0

我有一個簡單的說法,在這一點上什麼都不做,我只是開始使用Pester,但我的目標是模擬Remove-ADGroupMember和其他AD PowerShell命令進行測試。呼叫歷史中的Pester BoundParams空

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線工作,但無論怎樣我嘗試在第二個測試總是失敗。一段時間後,我挖成斷言MockCalled功能可按一個調試器,它看起來像 - 成員參數都迷路

enter image description here

畫面中的值高於我的斷言MockCalled功能很Mock.ps1,並且您可以看到傳遞給成員的值缺失。如果我只向Remove-ADGroupMember模擬傳遞1值,如下所示:Remove-ADGroupMember -Identity "dale" -Members "dale"我在BoundParams中看到的值是{}而不是{, },如您在屏幕截圖中看到的那樣。

這是一個問題,我正在做的方式或問題的方式,病人閱讀PARAMS等從Remove-ADGroupMember?

+0

如果你只能做第二'斷言MockCalled'它的工作原理或都是'Members'值仍然失去了什麼? – briantist

+0

是的......我評論了第一個Assert-MockCalled語句和成員= {,} – Dale

回答

1

Identity或Members參數的類型是String,所以這就是爲什麼你的斷言不起作用。

  • 身份 - 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) 
+0

**是的,工作感謝**。我想,因爲我傳遞一個字符串到Remove-ADGroupMember調用,我將不得不測試一個字符串。 – Dale