如何模拟点源脚本?
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
关键字,可用于在您的案例中跨范围发送数据。您可以在您谈到的函数内部使用 Return
或 Script2.ps1
本身。您不需要在另一个脚本中修改您的变量。相反,将值传递给它,在 Script2
中本地修改它,Return
到 Script1
,您可以在其中获取修改后的值。
脚本 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
}
我们正在尝试弄清楚如何 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
关键字,可用于在您的案例中跨范围发送数据。您可以在您谈到的函数内部使用 Return
或 Script2.ps1
本身。您不需要在另一个脚本中修改您的变量。相反,将值传递给它,在 Script2
中本地修改它,Return
到 Script1
,您可以在其中获取修改后的值。
脚本 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
}