纠缠测试模块是否存在。不应抛出特定的 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 它,要么找到一种方法来加载所需的命令。