为什么不调用此 Pester 3.4 模拟?
Why Isn't This Pester 3.4 Mock Being Called?
我有一个像这样的 Powershell 5.1 模块:
function CheckEventViewerForErrors(
[string] $logName,
[string] $logSource,
[System.DateTime] $dateGreaterThanFilter
) {
try {
$logs = Get-EventLog -LogName $logName -Source $logSource
$errorLogs = $logs | Where-Object {
($_.TimeGenerated -gt $dateGreaterThanFilter) `
-and `
($_.EntryType -eq 'Error')
}
if ($null -ne $errorLogs) {
return $true
}
return $false
}
catch {
return $true
}
}
Export-ModuleMember -Function "*"
我想像下面这样使用 Pester 3.4.0 进行测试,但是当我使用注释掉的参数过滤器时,没有调用模拟。
Describe 'CheckEventViewerForErrors' {
$logName = 'Application'
$logSource = "Pester"
$time = Get-Date
$cmdToMock = 'Get-EventLog'
$moduleName = $module.Name
Context 'Tests using mocks' {
# $paramFilter = { ($LogName -eq $logSource) -and ($LogName -eq $logName) }
It 'returns $false when there are entries for the source but no errors' {
Mock `
-ModuleName $moduleName `
-CommandName $cmdToMock `
-MockWith { return @{ TimeGenerated = $time; EntryType = 'Error' } }
# -ParameterFilter $paramFilter
$expected = $false
[bool] $actual = CheckEventViewerForErrors `
-logName $logName `
-logSource $logSource `
-dateGreaterThanFilter $time
Assert-MockCalled -Module $moduleName -CommandName $cmdToMock # -ParameterFilter $paramFilter
$actual | Should Be $expected
}
}
}
这段代码有什么问题?。如何在导出的函数中模拟 Get-EventLog 的使用?
上述测试返回此消息:
Expected Get-EventLog to be called at least 1 times but was called 0 times
您的参数过滤器有一个错误,您过滤了两次 LogName,但使用了不同的变量(因此它最终不会导致在脚本中匹配使用 Get-EventLog
):
$paramFilter = { ($LogName -eq $logSource) -and ($LogName -eq $logName) }
如果我把它改成这个,你的代码对我有用:
$paramFilter = { ($LogSource -eq $logSource) -and ($LogName -eq $logName) }
我有一个像这样的 Powershell 5.1 模块:
function CheckEventViewerForErrors(
[string] $logName,
[string] $logSource,
[System.DateTime] $dateGreaterThanFilter
) {
try {
$logs = Get-EventLog -LogName $logName -Source $logSource
$errorLogs = $logs | Where-Object {
($_.TimeGenerated -gt $dateGreaterThanFilter) `
-and `
($_.EntryType -eq 'Error')
}
if ($null -ne $errorLogs) {
return $true
}
return $false
}
catch {
return $true
}
}
Export-ModuleMember -Function "*"
我想像下面这样使用 Pester 3.4.0 进行测试,但是当我使用注释掉的参数过滤器时,没有调用模拟。
Describe 'CheckEventViewerForErrors' {
$logName = 'Application'
$logSource = "Pester"
$time = Get-Date
$cmdToMock = 'Get-EventLog'
$moduleName = $module.Name
Context 'Tests using mocks' {
# $paramFilter = { ($LogName -eq $logSource) -and ($LogName -eq $logName) }
It 'returns $false when there are entries for the source but no errors' {
Mock `
-ModuleName $moduleName `
-CommandName $cmdToMock `
-MockWith { return @{ TimeGenerated = $time; EntryType = 'Error' } }
# -ParameterFilter $paramFilter
$expected = $false
[bool] $actual = CheckEventViewerForErrors `
-logName $logName `
-logSource $logSource `
-dateGreaterThanFilter $time
Assert-MockCalled -Module $moduleName -CommandName $cmdToMock # -ParameterFilter $paramFilter
$actual | Should Be $expected
}
}
}
这段代码有什么问题?。如何在导出的函数中模拟 Get-EventLog 的使用?
上述测试返回此消息:
Expected Get-EventLog to be called at least 1 times but was called 0 times
您的参数过滤器有一个错误,您过滤了两次 LogName,但使用了不同的变量(因此它最终不会导致在脚本中匹配使用 Get-EventLog
):
$paramFilter = { ($LogName -eq $logSource) -and ($LogName -eq $logName) }
如果我把它改成这个,你的代码对我有用:
$paramFilter = { ($LogSource -eq $logSource) -and ($LogName -eq $logName) }