如何模拟点源脚本?

How to mock a script that is dot sourced?

我们正在尝试弄清楚如何 mock Pester.

中的点源脚本

Script1.ps1

$Import = @('Script 1 data')

. 'C:\Script2.ps1' -JobName 'Script 2 data'

$Import

Script2.ps1

Param (
    [String]$JobName
)

$Import += $JobName

输出

Script 1 data
Script 2 data

在上面的示例中,Script2.ps1 已经在单独的 Pester 测试文件 (Script2.Tests.ps1) 中进行了测试。对于 Script1.ps1 的测试,我们只需要评估是否调用了另一个脚本。

Script1.ps1 中,我们明确使用点源来确保 changed/updated 变量返回当前范围。

一种方法是使用 Function 的唯一目的是调用 Script2.ps1 然后可以很容易地模拟。但是,在那种情况下,变量修改停留在函数范围内。

评估脚本是否已调用并确保变量返回当前范围的最佳方法是什么?

嗯,您有 Return 关键字,可用于在您的案例中跨范围发送数据。您可以在您谈到的函数内部使用 ReturnScript2.ps1 本身。您不需要在另一个脚本中修改您的变量。相反,将值传递给它,在 Script2 中本地修改它,ReturnScript1,您可以在其中获取修改后的值。

脚本 1

$Import = @('Script 1 data')

$ModValue = . 'C:\Script2.ps1' -JobName 'Script 2 data'

$Import += $ModValue
$Import

Script2

Param (
    [String]$JobName
)
#do what you need to do here
$modifiedvalue = $JobName #For the sake of demo i am doing this.

Return $modifiedvalue #Where $modifiedvalue is what you want to send back to script1

输出

Script 1 data
Script 2 data

如果需要,您可以在 script2 中添加错误处理,并且 return 错误消息也可以添加到 Script1。在这种情况下检查 $ModValue 的值可以让您更好地控制理解 script2 中发生的事情。

Param (
    [String]$JobName
)

try
{
    #do what you need to do here
    $modifiedvalue = $JobName #For the sake of demo

    Return $modifiedvalue #Where $modifiedvalue is what you want to send back to script1
}
catch
{
    Return $_.Exception.Message
}