为何Pester中无法测试ParameterBindingValidationException异常?
问题原因
System.Management.Automation.ParameterBindingValidationException属于PowerShell内部非公开类型,无法直接通过命名空间+类名的方式显式引用,因此会抛出找不到类型的报错。- 测试代码中
ExpectedMessage的参数名匹配错误:实际函数的参数名为Folder,你写的是OutDir,会导致消息匹配失败。
修复方案
方案1:使用公开父类(最简单,推荐)
ParameterBindingValidationException继承自公开的System.Management.Automation.ParameterBindingException,所有参数绑定验证类错误都会抛出该父类异常,完全可以满足过滤非相关异常的需求,只需修正消息和类型引用即可:
$ShouldParams = @{ Throw = $true # 修正参数名匹配 ExpectedMessage = "Cannot validate argument on parameter 'Folder'. OutDir must be a folder path, not a file." # 使用可直接引用的公开父类 ExceptionType = ([System.Management.Automation.ParameterBindingException]) } { Test-Validation -Folder C:\Temp\file.txt } | Should @ShouldParams
方案2:严格匹配非公开子类
如果你必须严格校验到具体的子类类型,可以通过反射或者预触发错误的方式动态获取类型,无需显式引用:
# 方式A:预触发错误获取目标类型 $null = Test-Validation -Folder C:\Temp\file.txt -ErrorAction SilentlyContinue $targetExceptionType = $Error[0].Exception.GetType() # 方式B:通过反射直接加载类型,无需预触发错误 $targetExceptionType = [System.Management.Automation.ParameterBindingException].Assembly.GetType('System.Management.Automation.ParameterBindingValidationException') $ShouldParams = @{ Throw = $true ExpectedMessage = "Cannot validate argument on parameter 'Folder'. OutDir must be a folder path, not a file." ExceptionType = $targetExceptionType } { Test-Validation -Folder C:\Temp\file.txt } | Should @ShouldParams
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

