如何使用Pester测试无函数的Azure PowerShell脚本并验证输出?
解决Azure PowerShell函数的Pester测试报错问题
你遇到的“the term 'run' is not recognized”错误,核心原因是**run.ps1是脚本文件而非命名函数**:用. sourcing脚本后,脚本会直接执行,并不会定义一个名为run的函数供后续调用。
下面提供两种可行的解决方案:
方案1:将脚本逻辑封装为函数(推荐)
这种方式既不影响Azure函数的正常运行,又能方便地进行单元测试。
修改原run.ps1文件
将原脚本逻辑封装成函数,并保留原入口逻辑,确保生产环境不受影响:
function Invoke-MyFunction { param($Request, $TriggerMetadata) Write-Host $Request.Param1 Write-Host $Request.ParamB Write-Host $Request.ParamC return 200 } # 保留Azure函数原生执行逻辑 if ($MyInvocation.InvocationName -ne '&') { Invoke-MyFunction -Request $Request -TriggerMetadata $TriggerMetadata }
修改Pester测试脚本
现在可以直接调用封装好的函数,同时修正原测试中ParamA与Param1的拼写不一致问题:
using namespace System.Diagnostics.CodeAnalysis Describe "Test Run" { BeforeAll { $FunctionDir = $PSScriptRoot.Replace('Tests', 'myFunction') . $FunctionDir\run.ps1 # 加载封装的函数 } It "返回200状态码" { $Request = [PSCustomObject]@{ Param1 = 'A' # 与原脚本参数名保持一致 ParamB = 'B' ParamC = 'C' } $result = Invoke-MyFunction -Request $Request $result | Should -Be 200 } It "输出预期的Host信息" { $Request = [PSCustomObject]@{ Param1 = 'A' ParamB = 'B' ParamC = 'C' } # 捕获Write-Host输出(Write-Host写入编号为6的信息流) $hostOutput = & { Invoke-MyFunction -Request $Request } 6>&1 $hostOutput | Should -Contain 'A' $hostOutput | Should -Contain 'B' $hostOutput | Should -Contain 'C' } }
方案2:直接调用脚本文件(无需修改原脚本)
如果不想改动原函数脚本,可以直接调用脚本文件路径并传递参数:
修改Pester测试脚本
using namespace System.Diagnostics.CodeAnalysis Describe "Test Run" { BeforeAll { $FunctionPath = Join-Path ($PSScriptRoot.Replace('Tests', 'myFunction')) 'run.ps1' } It "返回200状态码" { $Request = [PSCustomObject]@{ Param1 = 'A' # 修正参数名拼写 ParamB = 'B' ParamC = 'C' } # 直接调用脚本文件并传递参数 $result = & $FunctionPath -Request $Request $result | Should -Be 200 } It "输出预期的Host信息" { $Request = [PSCustomObject]@{ Param1 = 'A' ParamB = 'B' ParamC = 'C' } # 捕获脚本的信息流输出 $hostOutput = & { & $FunctionPath -Request $Request } 6>&1 $hostOutput | Should -Contain 'A' $hostOutput | Should -Contain 'B' $hostOutput | Should -Contain 'C' } }
内容的提问来源于stack exchange,提问作者Kamsiinov
相关产品推荐
相关产品推荐

