自身功能的输出测试
Output testing for own functions
我有一个函数 returns 配置文件的内容:
function Get-VA.Settings {
<#
.SYNOPSIS
Fetches settings from a XML file
.DESCRIPTION
Fetches settings from a XML file and outputs a XML Object
.EXAMPLE
Get-VA.Settings -path <path-to-config-file> -Rollback <path-to-rollback-file>
#>
Param (
[Parameter(Mandatory=$true,Position=0)]
[string]$path,
[Parameter(Mandatory=$true,Position=1)]
[string]$Rollback
)
try {
[xml]$config = Get-Content -Path $path
Write-Output -InputObject $config
} catch {
Write-VA.EventLog -Message ("Could not load Configuration File: `r`n" + $Error) -Id 11 -type Error
Invoke-VA.Rollback -Path $($Rollback)
}
}
现在我在 Pester 中进行了测试,它只是检查函数是否确实 returns 某些东西:
Import-Module ($PSScriptRoot + "\utility.psm1")
Describe "Settings Module" {
InModuleScope utility {
Context "Get-VA.Settings" {
It "should have Help and Examples" {
$helpinfo = Get-Help Get-VA.Settings
$helpinfo.examples | should not BeNullOrEmpty # should have examples
$helpinfo.details | should not BeNullOrEmpty # should have Details
$helpinfo.description | Should not BeNullOrEmpty # Should have a Description for the Function
}
It "should fail safely on read Error" {
Mock Get-Content {throw}
Mock Write-VA.EventLog { }
Mock Invoke-VA.Rollback { }
Get-VA.Settings -path "1" -Rollback "1"
Assert-MockCalled Invoke-VA.Rollback -Times 1
}
It "should return a value" {
Set-Content -Value "<xml><foo>bar</foo></xml>" -Path "settings-test.ps1"
Get-VA.Settings -path .\settings-test.ps1 -Rollback "1" | should not BeNullOrEmpty
Remove-Item "settings-test.ps1"
}
}
}
}
现在无论我做什么来输出配置设置,我似乎都无法通过 Pester 的测试,即使功能正常运行也是如此。
[-] should return a value 18ms
Expected: value to not be empty
Get-ConfigSettings -path .\settings-test.ps1 -Rollback "1" | should not BeNullOrEmpty
我是不是漏掉了什么?那么我该如何正确处理函数输出呢?
Get-Help Context
Any Mocks defined inside a Context are removed at the end of the Context scope,
由于It "should fail safely on read Error"
(1)和It "should return a value"
(2)属于同一个Context
块,所以(1)中定义的Mock Get-Content {throw}
在(2)中仍然有效,这样 Get-VA.Settings
就不会调用 Get-Content
cmdlet,而是调用 mock。
我有一个函数 returns 配置文件的内容:
function Get-VA.Settings {
<#
.SYNOPSIS
Fetches settings from a XML file
.DESCRIPTION
Fetches settings from a XML file and outputs a XML Object
.EXAMPLE
Get-VA.Settings -path <path-to-config-file> -Rollback <path-to-rollback-file>
#>
Param (
[Parameter(Mandatory=$true,Position=0)]
[string]$path,
[Parameter(Mandatory=$true,Position=1)]
[string]$Rollback
)
try {
[xml]$config = Get-Content -Path $path
Write-Output -InputObject $config
} catch {
Write-VA.EventLog -Message ("Could not load Configuration File: `r`n" + $Error) -Id 11 -type Error
Invoke-VA.Rollback -Path $($Rollback)
}
}
现在我在 Pester 中进行了测试,它只是检查函数是否确实 returns 某些东西:
Import-Module ($PSScriptRoot + "\utility.psm1")
Describe "Settings Module" {
InModuleScope utility {
Context "Get-VA.Settings" {
It "should have Help and Examples" {
$helpinfo = Get-Help Get-VA.Settings
$helpinfo.examples | should not BeNullOrEmpty # should have examples
$helpinfo.details | should not BeNullOrEmpty # should have Details
$helpinfo.description | Should not BeNullOrEmpty # Should have a Description for the Function
}
It "should fail safely on read Error" {
Mock Get-Content {throw}
Mock Write-VA.EventLog { }
Mock Invoke-VA.Rollback { }
Get-VA.Settings -path "1" -Rollback "1"
Assert-MockCalled Invoke-VA.Rollback -Times 1
}
It "should return a value" {
Set-Content -Value "<xml><foo>bar</foo></xml>" -Path "settings-test.ps1"
Get-VA.Settings -path .\settings-test.ps1 -Rollback "1" | should not BeNullOrEmpty
Remove-Item "settings-test.ps1"
}
}
}
}
现在无论我做什么来输出配置设置,我似乎都无法通过 Pester 的测试,即使功能正常运行也是如此。
[-] should return a value 18ms
Expected: value to not be empty
Get-ConfigSettings -path .\settings-test.ps1 -Rollback "1" | should not BeNullOrEmpty
我是不是漏掉了什么?那么我该如何正确处理函数输出呢?
Get-Help Context
Any Mocks defined inside a Context are removed at the end of the Context scope,
由于It "should fail safely on read Error"
(1)和It "should return a value"
(2)属于同一个Context
块,所以(1)中定义的Mock Get-Content {throw}
在(2)中仍然有效,这样 Get-VA.Settings
就不会调用 Get-Content
cmdlet,而是调用 mock。