纠缠测试模块是否存在。不应抛出特定的 ExceptionType
Pester test if the module is existing. Should not throw specific ExceptionType
是只有我还是Pester很难抓到?
在 BeforeAll
脚本块中,我想测试 ActiveDirectory
模块是否存在于本地机器上。
测试不应该抛出异常类型[System.IO.FileNotFoundException]
问题一:
correct/best 方法是什么?
Get-Module Module| Remove-Module -Force
Import-Module Module
Import-Module Pester
InModuleScope Module{
Describe 'Add-Patchgroup' {
BeforeAll {
It 'Should import module ActiveDirectory' {
{Import-Module -Name ActiveDirectory -ErrorAction Stop } | Should -Not -Throw -ExceptionType {[System.IO.FileNotFoundException]}
}
}
}
}
当我在 AD 模块不可用的机器上 运行 时出错:
Describing Add-Patchgroup
[-] Should import module ActiveDirectory 99ms
PSInvalidCastException: Cannot convert the "[System.IO.FileNotFoundException]" value of type "System.Management.Auto
mation.ScriptBlock" to type "System.Type".
ArgumentTransformationMetadataException: Cannot convert the "[System.IO.FileNotFoundException]" value of type "Syste
m.Management.Automation.ScriptBlock" to type "System.Type".
ParameterBindingArgumentTransformationException: Cannot process argument transformation on parameter 'ExceptionType'
. Cannot convert the "[System.IO.FileNotFoundException]" value of type "System.Management.Automation.ScriptBlock" to typ
e "System.Type".
问题二:
还要考虑有一个名为 ComplexModule
的模块,导入起来非常耗时。因此我想模拟 Import-Module -Name ComplexModule
cmdlet。我该怎么做?
您对是否已抛出异常的测试需要将异常指定为字符串:
It 'Should import module ActiveDirectory' {
{Import-Module -Name ActiveDirectory -ErrorAction Stop } | Should -Not -Throw -ExceptionType System.IO.FileNotFoundException
}
您可以 Mock
您的 Import-Module
如下:
Mock Import-Module {} -ParameterFilter {$Name -eq 'ComplexModule'}
请注意,您在模拟后在 Pester 脚本中使用 Import-Module
successfully/legitimately 时可能会遇到问题,但只要您在 Mock 之前使用它,我认为您就可以了.
另请注意,此 Mock 不执行任何操作(因此为空 {}
),因此它有效地确保模块未加载。如果您的测试依赖于正在加载的模块,则您需要要么不 Mock
它,要么找到一种方法来加载所需的命令。
是只有我还是Pester很难抓到?
在 BeforeAll
脚本块中,我想测试 ActiveDirectory
模块是否存在于本地机器上。
测试不应该抛出异常类型[System.IO.FileNotFoundException]
问题一:
correct/best 方法是什么?
Get-Module Module| Remove-Module -Force
Import-Module Module
Import-Module Pester
InModuleScope Module{
Describe 'Add-Patchgroup' {
BeforeAll {
It 'Should import module ActiveDirectory' {
{Import-Module -Name ActiveDirectory -ErrorAction Stop } | Should -Not -Throw -ExceptionType {[System.IO.FileNotFoundException]}
}
}
}
}
当我在 AD 模块不可用的机器上 运行 时出错:
Describing Add-Patchgroup
[-] Should import module ActiveDirectory 99ms
PSInvalidCastException: Cannot convert the "[System.IO.FileNotFoundException]" value of type "System.Management.Auto
mation.ScriptBlock" to type "System.Type".
ArgumentTransformationMetadataException: Cannot convert the "[System.IO.FileNotFoundException]" value of type "Syste
m.Management.Automation.ScriptBlock" to type "System.Type".
ParameterBindingArgumentTransformationException: Cannot process argument transformation on parameter 'ExceptionType'
. Cannot convert the "[System.IO.FileNotFoundException]" value of type "System.Management.Automation.ScriptBlock" to typ
e "System.Type".
问题二:
还要考虑有一个名为 ComplexModule
的模块,导入起来非常耗时。因此我想模拟 Import-Module -Name ComplexModule
cmdlet。我该怎么做?
您对是否已抛出异常的测试需要将异常指定为字符串:
It 'Should import module ActiveDirectory' {
{Import-Module -Name ActiveDirectory -ErrorAction Stop } | Should -Not -Throw -ExceptionType System.IO.FileNotFoundException
}
您可以 Mock
您的 Import-Module
如下:
Mock Import-Module {} -ParameterFilter {$Name -eq 'ComplexModule'}
请注意,您在模拟后在 Pester 脚本中使用 Import-Module
successfully/legitimately 时可能会遇到问题,但只要您在 Mock 之前使用它,我认为您就可以了.
另请注意,此 Mock 不执行任何操作(因此为空 {}
),因此它有效地确保模块未加载。如果您的测试依赖于正在加载的模块,则您需要要么不 Mock
它,要么找到一种方法来加载所需的命令。