难道只有我还是Pester吗?
在BeforeAll
脚本块中,我想测试ActiveDirectory
模块在本地计算机上是否存在。
测试不应引发异常类型[System.IO.FileNotFoundException]
问题1:
什么是正确/最佳方法?
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".
问题2:
还要考虑有一个名为ComplexModule
的模块,这对于导入非常耗时。因此,我想模拟Import-Module -Name ComplexModule
cmdlet。我该怎么办?
答案 0 :(得分:2)
您的是否已引发异常的测试需要将异常指定为字符串:
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
可能会有问题,但是只要您在Mock之前使用它,我想您就可以了。
还请注意,此Mock不执行任何操作(因此为空的{}
),因此可以有效地确保未加载模块。如果您的测试依赖于正在加载的模块,则无需Mock
或寻找一种方法来加载所需的命令。