首先,如果這不是提出這些問題的正確方法,我會道歉,這是我第一次提交給 SO。
簡短的版本是:
我有一個腳本Get-SamAccountName.ps1,它采用 a 的輸入變數,-FirstName, -LastName, -Format然后根據格式生成一個新的 SamAccountName。現在該函式本身作業得非常好(針對 AD 物件進行了測驗以驗證)。
但是,當我嘗試為此撰寫一些 Pester 測驗時,我遇到了一些麻煩,特別是圍繞 Pester 的 Mock 功能。
該功能的相關部分Get-SamAccountName如下(去掉了引數塊等不相關的專案):
function Get-SamAccountName {
param(
[string[]]$FirstName,
[string[]]$LastName,
[string[]]$Format
)
................
# If SamAccountName already in use, add a number until you find a free SamAccountName to use.
if (Get-ADUser -Filter {samaccountname -eq $BaseSam} -ErrorAction SilentlyContinue) {
$index = 0
do {
$index
$SamAccountName = "{0}{1}" -f $BaseSam.ToLower(),$index
} until (-not(Get-ADUser -Filter {samaccountname -eq $SamAccountName} -ErrorAction SilentlyContinue))
} else {
$SamAccountName = $BaseSam.tolower()
}
return $SamAccountName
}
這部分功能是Get-ADUser使用的地方,也是我試圖在我的 Pester 測驗中模擬的地方。$BaseSam本質上是從名字和姓氏生成的基本 SamAccountName ,然后檢查 AD 以查看它是否存在,如果它確實在每個存在的迭代的 SamAccountName 末尾添加一個 #。
我的 Pester 測驗檔案如下,就像上面剝離了其他有效的測驗(以第一個為例):
$ModuleRoot = $env:BHModulePath
$ModuleName = $env:BHProjectName
$ModulePath = $env:BHPSModuleManifest
Remove-Module -Name $ModuleName -ErrorAction 'SilentlyContinue'
Import-Module $ModulePath -Force
InModuleScope $ModuleName {
BeforeAll {
# Load Public function
. "$ModuleRoot\Public\Get-SamAccountName.ps1"
function Get-ADUser ($Filter) {}
}
Describe -Tags ('Unit') "Unit Tests for Get-SamAccountName" {
#Run tests based upon the Examples from the Function Docs
................
Context -Tags ('Unit') "Using the -FLast Format" {
It "Returns <SamAccountName> SamAccountName from FirstName <FirstName> and LastName <LastName> Inputs in the -FLast format." -TestCases @(
#Test with string containing Diacritic characters.
@{ FirstName = "Cl?rk"; LastName = "Ként"; SamAccountName = "ckent"}
#Test with string containing Latin characters only.
@{ FirstName = "Bruce"; LastName = "Wayne"; SamAccountName = "bwayne"}
) {
Get-SamAccountName -FirstName $FirstName -LastName $LastName -Format 'FLast' | Should -Be $SamAccountName
}
}
................
Context -Tags ('Unit') "A User Already Exists in Active Directory" {
It "Returns <expected> SamAccountName from FirstName <FirstName> and LastName <LastName> with an increment number." -TestCases @(
#Test with string containing Diacritic characters.
@{ FirstName = "Cl?rk"; LastName = "Ként"; BaseSam = "ckent"; expected = "ckent1"}
#Test with string containing Latin characters only.
@{ FirstName = "Bruce"; LastName = "Wayne"; BaseSam = "bwayne"; expected = "bwayne"}
) {
Mock Get-ADUser -MockWith { $BaseSam } -ParameterFilter { $Filter -eq {samaccountname -eq $BaseSam} }
Get-SamAccountName -FirstName $FirstName -LastName $LastName -Format 'FLast' | Should -Be $expected
}
}
}
}
現在,我現在故意有不同的預期,因為我想看到一個測驗失敗,一個通過以驗證它是否已正確設定,最終結果都設定為username1(附加的 1 以驗證現有的 AD用戶被發現)。
在技??術上運行這個作業如上,通過/失敗但它與我試圖實作的相反(下面的 Pester 輸出):
Describing Unit Tests for Get-SamAccountName
Context A User Already Exists in Active Directory
[-] Returns ckent1 SamAccountName from FirstName Cl?rk and LastName Ként with an increment number. 12ms (10ms|2ms)
Expected strings to be the same, but they were different.
Expected length: 9
Actual length: 8
Strings differ at index 8.
Expected: 'ckent1'
But was: 'ckent'
--------^
at Get-SamAccountName -FirstName $FirstName -LastName $LastName -Format 'FLast' | Should -Be $expected, /mnt/k/Repositories/CodeBlue.UserAutomation/Tests/Unit/Get-SamAccountName.Unit.Tests.ps1:70
at <ScriptBlock>, /mnt/k/Repositories/CodeBlue.UserAutomation/Tests/Unit/Get-SamAccountName.Unit.Tests.ps1:70
[ ] Returns bwayne SamAccountName from FirstName Bruce and LastName Wayne with an increment number. 9ms (8ms|1ms)
Tests completed in 281ms
Tests Passed: 1, Failed: 1, Skipped: 0 NotRun: 8
100% 可能是我的語法或專案的位置,我現在只使用 Pester 大約一個星期,從技術上講,這是我第一次嘗試使用 Mock。已經閱讀了關于 SO 的無數執行緒以及帶有示例的博客條目,但我無法讓這個特定的用例按預期作業:(
我會注意到上面只是我嘗試過的 Mock 的一個迭代,但我設法讓“作業”的唯一一個迭代,盡管以與我試圖做的相反的方式。
非常感謝任何幫助<3
uj5u.com熱心網友回復:
這是相當棘手的。在我看來有兩個問題:
- 您
Mock沒有觸發,因為-ParameterFilter與 的呼叫不匹配Get-ADUser。 - 您需要
Get-ADUser以 2 種不同的方式模擬您的測驗,以便在第一次使用時回傳結果,但在第二次呼叫時它不回傳任何內容。
我已經創建了我認為可行的解決方案,但是因為要-ParameterFilter很好地使用Get-ADUser's-Filter引數似乎非常困難,所以我更改了您的函式,以便對于其中一個Get-ADUser呼叫它包含-Properties引數,以便我可以區分在此基礎上使用。另一種方法可能是Get-ADUser在您第一次和第二次使用它時創建兩個包裝函式。
這是我的解決方案。我還必須編輯你的函式,因為我錯過了你設定的部分$BaseSam。這適用于布魯斯韋恩,但不適用于克拉克肯特,因為它不處理外國角色。
BeforeAll {
function Get-SamAccountName {
param(
[string]$FirstName,
[string[]]$LastName,
[string[]]$Format
)
$BaseSam = $FirstName[0] $LastName
# If SamAccountName already in use, add a number until you find a free SamAccountName to use.
if (Get-ADUser -Filter { samaccountname -eq $BaseSam } -Properties SamAccountName -ErrorAction SilentlyContinue) {
$index = 0
do {
$index
$SamAccountName = "{0}{1}" -f $BaseSam.ToLower(), $index
} until (-not(Get-ADUser -Filter { samaccountname -eq $SamAccountName } -ErrorAction SilentlyContinue))
}
else {
$SamAccountName = $BaseSam.tolower()
}
return $SamAccountName
}
function Get-ADUser {
param( $Filter, $Properties)
}
}
Describe -Tags ('Unit') "Unit Tests for Get-SamAccountName" {
Context -Tags ('Unit') "A User Already Exists in Active Directory" {
It "Returns <expected> SamAccountName from FirstName <FirstName> and LastName <LastName> with an increment number." -TestCases @(
#Test with string containing Diacritic characters.
@{ FirstName = "Cl?rk"; LastName = "Ként"; BaseSam = "ckent"; expected = "ckent1" }
#Test with string containing Latin characters only.
@{ FirstName = "Bruce"; LastName = "Wayne"; BaseSam = "bwayne"; expected = "bwayne1" }
) {
Mock Get-ADUser -MockWith { $BaseSam } -ParameterFilter { $Properties -eq 'SamAccountName' }
Mock Get-ADUser -MockWith { }
Get-SamAccountName -FirstName $FirstName -LastName $LastName -BaseSam $BaseSam -Format 'FLast' | Should -Be $expected
}
}
}
請注意,我的示例中包含您的功能BeforeAll只是為了便于測驗,您可以繼續匯入您的模塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436664.html
上一篇:角度單元測驗:可觀察的不回傳結果
下一篇:類中的屬性無法保存為什么
