Pester测试模块是否存在。不应抛出特定的ExceptionType

时间:2018-07-24 14:02:43

标签: powershell unit-testing pester

难道只有我还是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。我该怎么办?

1 个答案:

答案 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或寻找一种方法来加载所需的命令。