Pester 5.5测试Get-Flags时无法识别C#回调类型的问题
解决Pester测试中找不到C#自定义类型及Mock回调的问题
问题根源
你遇到的两个错误本质是同一个问题:
Unable to find type [SSK.Actions.WhenSucceeded]:测试脚本的运行环境没有加载包含这个C#类型的程序集,PowerShell识别不了该类型。No modules named 'SSK.Actions' are currently loaded:SSK.Actions是C#的命名空间,不是PowerShell模块,所以Mock -ModuleName的用法完全不适用。
具体解决步骤
1. 先加载包含C#类型的程序集
在测试脚本最开始,用Add-Type加载定义了SSK.Actions.WhenSucceeded的DLL文件:
# 替换为你的实际DLL路径 Add-Type -Path "C:\Path\To\Your\SSKAssembly.dll"
如果这个C#类型是内嵌在PowerShell脚本里的(比如用Add-Type -TypeDefinition动态编译的),要确保测试脚本中也执行了这段编译代码,让测试环境能识别该类型。
2. 处理System.Action[SSK.Actions.WhenSucceeded]类型的参数
因为$MyCallback是一个委托类型,不需要Mock所谓的WhenSucceeded命令,直接创建符合类型要求的委托实例即可:
- 如果只需要传入一个空回调(不需要验证是否被调用):
$emptyCallback = [System.Action[SSK.Actions.WhenSucceeded]]{} Get-Flags -MyCallback $emptyCallback
- 如果需要验证回调是否被调用:
$callbackInvoked = $false $verifiableCallback = [System.Action[SSK.Actions.WhenSucceeded]]{ $script:callbackInvoked = $true } # 调用待测试的函数 Get-Flags -MyCallback $verifiableCallback # 断言回调已被触发 It "Should invoke the callback" { $callbackInvoked | Should -Be $true }
3. 若需Mock C#静态方法(当WhenSucceeded是静态方法时)
如果Get-Flags内部会直接调用[SSK.Actions.WhenSucceeded]::SomeMethod()这类静态方法,Pester本身无法直接Mock C#静态方法,你可以用以下两种方式处理:
- 方式一:创建存根类型
重新定义一个同名的C#类,覆盖原类型的实现(仅在测试环境生效):
注意:这种方式需要确保在加载原DLL之前执行,或者用Add-Type -TypeDefinition @" namespace SSK.Actions { public static class WhenSucceeded { // 空实现或自定义测试逻辑 public static void YourMethod() {} } } "@ -Force-Force强制覆盖类型定义(仅限同AppDomain内)。 - 方式二:重构代码(推荐)
如果可以修改原脚本,将C#静态方法的调用封装成PowerShell函数,这样就能用Pester的Mock命令来拦截:# 原脚本中新增封装函数 function Invoke-WhenSucceeded { [SSK.Actions.WhenSucceeded]::YourMethod() } # 在Get-Flags中调用这个封装函数而非直接调用C#方法 # 测试脚本中Mock这个PowerShell函数 Mock -CommandName Invoke-WhenSucceeded {}
内容的提问来源于stack exchange,提问作者user1540857
相关产品推荐
相关产品推荐

