2016-06-21 61 views
3

我正在使用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正確使用點源功能?

回答

2

Invoke-Bar明確點源Invoke-Foo從一個文件,然後調用 它。點源功能隱藏其他定義的Invoke-Foo,包括 嘲笑。

如果我們從Invoke-Bar中刪除. .\foo.ps1,那麼Pester模擬工作,我們得到「香蕉」。

如果我們刪除模擬,那麼所有的作品,即所有的命令都可以找到,但我們得到了「Cantelope」。

換句話說,如果你想Invoke-Foo是可嘲弄的,那麼請不要在Invoke-Bar中點源。 Invoke-Bar應該假設Invoke-Foo是預先定義的(原始或嘲笑),並使用它。