如何模拟点源脚本?

时间:2018-07-20 06:54:48

标签: powershell mocking pester

我们正在尝试找出如何在mockPester使用点源脚本。

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中,我们明确使用点源,以确保已更改/更新的变量返回当前范围。

一种方法是使用Function,其唯一目的是调用Script2.ps1,然后可以轻松地对其进行嘲笑。但是,在这种情况下,变量修改会卡在功能范围内。

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

1 个答案:

答案 0 :(得分:1)

好吧,您有一个Return关键字,可用于在您的案例中跨范围发送数据。您可以在所讨论的函数内部使用ReturnScript2.ps1本身。您无需在另一个脚本中修改变量。取而代之的是,将值传递给它,在Script2中进行本地修改,ReturnScript1中,在其中获取修改后的值。

脚本1

$Import = @('Script 1 data')

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

$Import += $ModValue
$Import

脚本2

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中添加错误处理,也可以将错误消息返回给Script1。在这种情况下,检查$ModValue的值可以使您更好地控制脚本2中发生的情况。

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
}