2016-06-21 1 views
3

私はPesterを使用して、別のスクリプトをドットソースするPowerShellスクリプトをテストしています。私がドットソーシングされている機能をモックしようとすると、Pesterは嘲笑されたバージョンの使用を拒否します。 .psm1ファイルに追加し、ドットソーシングの代わりにImport-Moduleを使用して関数をソースしようとすると、同じ問題が発生します。Pesterはドットソースでない機能を模倣していません

私が抱えている問題を再現した例です。 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' 
    } 
} 

起動-はFooをモックした後、結果は、 'バナナ' でなければなりません、結果は次のとおりです。

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にdot-sourced関数を正しく動作させるにはどうすればよいですか?

答えて

2

Invoke-Barファイルから明示的にドットソースInvoke-Fooを入力し、 を呼び出します。ドットソース関数は を含む、Invoke-Fooと定義された他の要素を隠します。

. .\foo.ps1Invoke-Barから削除すると、Pesterモックが機能し、「バナナ」を取得します。

モックを削除するとすべてのコマンドが検出されますが、「Cantelope」と表示されます。

つまり、Invoke-Fooをモック可能にしたい場合は、Invoke-Barにドットを入れないでください。 Invoke-Barは、Invoke-Fooがあらかじめ定義されている(オリジナルまたは嘲笑されている)と仮定し、それを使用するだけです。

関連する問題