有没有办法在不执行脚本的情况下测试PowerShell脚本中的函数?

w6lpcovy  于 2023-02-12  发布在  Shell
关注(0)|答案(3)|浏览(136)

我想在我的PowerShell脚本中定义独立函数,并且能够在不执行脚本其余部分的情况下对这些函数进行Pester测试。有没有办法在不单独文件中定义这些函数的情况下实现这一点?
在下面的伪代码示例中,如何在不执行mainFunctionality的情况下测试functionA或functionB?

    • 脚本. ps1:**
functionA
functionB
...
mainFunctionality
    • 脚本.测试. ps1:**
BeforeAll {
  . $PSScriptRoot/script.ps1 # This will execute the mainFunctionality, which is what I want to avoid
}
Describe 'functionA' { 
   # ... tests
}

我相信在Python中,你可以通过将你的"mainFunctionality" Package 在这个条件中来做到这一点,所以我正在Powershell中寻找类似的东西。

if __name__ == '__main__':
    mainFunctionality

参考:What does if name == "main": do?

kwvwclae

kwvwclae1#

使用PowerShell Abstract Syntax Tree (AST)获取并调用functionA

$ScriptBlock = {
    function functionA {
        Write-Host 'Do something A'
    }
    
    function functionB {
        Write-Host 'Do something A'
    }
    
    function mainFunctionality {
        # Do something
        functionA
        # Do something
        functionB
        # Do something
    }
    
    mainFunctionality
}

Using NameSpace System.Management.Automation.Language
$Ast = [Parser]::ParseInput($ScriptBlock, [ref]$null, [ref]$null) # or: ParseFile
$FunctionA = $Ast.FindAll({
    $Args[0] -is [ScriptBlockAst] -and $Args[0].Parent.Name -eq 'functionA'
}, $True)
Invoke-Expression $FunctionA.EndBlock

Do something A
ix0qys7i

ix0qys7i2#

你可以使用$MyInvocation.PSCommandPath来确定谁调用了你的脚本,这是我能想到的最接近Python的if __name__ == '__main__':的。这个属性将给你调用者的绝对路径。从那里你可以提取脚本名,即使用Path.GetFileName,然后你可以确定你想要做什么,例如,* * 如果呼叫方的名称等于main.ps1,则调用mainFunctionality;如果呼叫方的名称不等于script.Tests.ps1,则调用mainFunctionality**。
下面是一个简短的例子。

      • 一米七三**
function A {
    "I'm function A"
}

function B {
    "I'm function B"
}

function mainFunctionality {
    "I'm function mainFunctionality"
}

A # Calls A
B # Calls B

# Call `mainFunctionality` only if my caller's name is `main.ps1`
if([System.IO.Path]::GetFileName($MyInvocation.PSCommandPath) -eq 'main.ps1') {
    mainFunctionality
}

然后,如果从main.ps1调用myScript.ps1,您将看到:

I'm function A
I'm function B
I'm function mainFunctionality

如果从其他地方调用myScript.ps1(控制台或其他名称不同的脚本),您将看到:

I'm function A
I'm function B
tpxzln5u

tpxzln5u3#

可以,您可以使用Invoke-Expression cmdlet测试PowerShell脚本中的函数,而无需执行脚本。此cmdlet允许您像执行命令一样执行字符串。例如,如果您的脚本中有一个名为Test-Function的函数,则可以使用以下命令对其进行测试:Invoke-Expression -Command "Test-Function"

function functionA {
    # Do something
}

function functionB {
    # Do something
}

function mainFunctionality {
    # Do something
    functionA
    # Do something
    functionB
    # Do something
}

mainFunctionality

可以,您可以在PowerShell脚本中测试函数,而无需执行脚本的其余部分。为此,您可以使用Invoke-Pester命令在脚本中运行特定测试。例如,如果要测试函数functionA和functionB,则可以使用以下命令:
调用纠缠脚本.\MyScript.ps1 -测试名称函数A、函数B
这将执行指定函数的测试,而不执行脚本的其余部分。

相关问题