纠缠不点功能是点源
问题描述:
我正在使用Pester测试一个PowerShell脚本点源其他脚本。当我尝试模拟点源的功能时,Pester拒绝使用模拟版本。当我尝试通过将函数添加到.psm1文件并使用Import-Module而不是点源来获取函数时,我遇到了同样的问题。纠缠不点功能是点源
下面是一个复制我遇到的问题的示例。所有3个文件都在同一个文件夹中。
Foo.ps1
Function Invoke-Foo{
'Cantelope'
}
Bar.ps1
function Invoke-Bar {
. .\foo.ps1
Invoke-foo
}
Bar.tests.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"
. .\Foo.ps1
Describe "Bar" {
It "Mocks Foo" {
Mock Invoke-Foo {'Banana'}
Invoke-Bar | should be 'Banana'
}
}
嘲笑调用-富后,结果应该是 '香蕉',但结果是:
Describing Bar
[-] Mocks Foo 36ms
Expected string length 6 but was 9. Strings differ at index 0.
Expected: {Banana}
But was: {Cantelope}
-----------^
9: Invoke-Bar | should be 'Banana'
at <ScriptBlock>, C:\Users\geinosky\Desktop\PingTest\Bar.tests.ps1: line 9
如何让Pester正确使用点源功能?
答
Invoke-Bar
明确点源Invoke-Foo
从一个文件,然后调用 它。点源功能隐藏其他定义的Invoke-Foo
,包括 嘲笑。
如果我们从Invoke-Bar
中删除. .\foo.ps1
,那么Pester模拟工作,我们得到“香蕉”。
如果我们删除模拟,那么所有的作品,即所有的命令都可以找到,但我们得到了“Cantelope”。
换句话说,如果你想Invoke-Foo
是可嘲弄的,那么请不要在Invoke-Bar
中点源。 Invoke-Bar
应该假设Invoke-Foo
是预先定义的(原始或嘲笑),并使用它。