如何在VS Code Test Explorer中测试PowerShell脚本内的指定函数
PowerShell指定函数导入测试方案
要在不执行整个myscript.ps1脚本的前提下仅导入Get-SomeThing函数用于测试,推荐使用AST(抽象语法树)解析方案,全程不需要修改原脚本,也不会触发脚本内任何顶层执行逻辑:
具体实现步骤
直接修改测试文件my.Tests.ps1的BeforeAll代码块,添加函数提取逻辑即可:
Describe 'My Tests' { BeforeAll { # 定位myscript.ps1的绝对路径 $scriptPath = Join-Path $PSScriptRoot '..\myscript.ps1' -Resolve # 解析脚本的抽象语法树 $ast = [System.Management.Automation.Language.Parser]::ParseFile($scriptPath, [ref]$null, [ref]$null) # 筛选出目标函数Get-SomeThing的定义 $targetFunction = $ast.Find({ $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] -and $args[0].Name -eq 'Get-SomeThing' }, $true) # 导入目标函数到当前测试作用域 . ([scriptblock]::Create($targetFunction.Extent.Text)) # 原有测试变量定义 $myVar = 'Hello' $myVar2= 'World' } It 'Test Hello World' { (Get-SomeThing -myVariable $myVar -myVariable2 $myVar2) | Should Be 'Hello World' } }
可修改原脚本的简化方案
如果允许调整myscript.ps1,可以给顶层执行逻辑加调用判断,避免被导入时执行:
找到myscript.ps1末尾的Get-SomeThingElse调用行,修改为如下内容:
# 仅当脚本被直接运行时执行该逻辑,被导入时跳过 if ($MyInvocation.InvocationName -ne '.') { Get-SomeThingElse -myVariableAgain $myVar -myVariableAgain2 $myVar2 }
修改完成后直接在测试文件的BeforeAll里执行. $scriptPath即可导入所有函数,该方案操作简单但会导入脚本内所有函数,没有第一种方案精准。
内容的提问来源于stack exchange,提问作者user16908085
相关产品推荐
相关产品推荐

