2017-01-27 11 views
2

私がせがむことは非常に新しいですし、私はPowerShellで非常に小型でシンプルな機能のためのテストを構築しようとしています:Mock関数がPesterでパイプライン入力を受け入れる方法は?

function Toggle-Notepad { 
    if (-not (Get-Process notepad -ErrorAction SilentlyContinue)) 
    { 
     Start-Process -FilePath Notepad 
    } 
    else 
    { 
     get-process notepad | stop-process 
    } 

} 

この機能には他に、実行されていない場合、停止した実行されている場合だけでメモ帳を起動しますそれ。期待通りに実行さ

$here = Split-Path -Parent $MyInvocation.MyCommand.Path 
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.' 
. "$here\$sut" 

Describe "Toggle-Notepad" { 
    Mock Stop-Process { "Process object passed! Stopping notepad!" } 
    Mock Start-Process { "Notepad is not running,starting it!" } -ParameterFilter { $Filepath -eq "Notepad" } 

    It "Starts notepad if it is not running" { 
     Toggle-Notepad | Should be "Notepad is not running,starting it!" 
    } 

    It "Stops notepad if it is running" { 
     Toggle-Notepad | Should be "Process object passed ! Stopping notepad!" 
    } 
} 

上記のテスト:私が設計している

テストはこれです。

Stop-Process関数を書き換えて、このバージョンがパイプライン入力を受け入れることを指定できるようにするにはどうすればよいですか?

私はこれを試してみましたが、それが動作していません。

$here = Split-Path -Parent $MyInvocation.MyCommand.Path 
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.' 
. "$here\$sut" 

Describe "Toggle-Notepad" { 
    Mock stop-process { "Process object passed ! Stopping notepad" } -ParameterFilter { $InputObject -is "System.Diagnostics.Process" } 
    Mock Start-Process {"Notepad is not running,starting it!"} -ParameterFilter { $Filepath -eq "Notepad" } 

    It "Starts notepad if it is not running" { 
     Toggle-Notepad | Should be "Notepad is not running,starting it!" 
    } 

    It "Stops notepad if it is running" { 
     Toggle-Notepad | Should be "Process object passed ! Stopping notepad!" 
    } 
} 

Stop-Process機能パイプライン入力を受け付けているので、私の目的は何のparamsを受け入れていない一般的なStop-Process関数を作成し、同様の機能をないモックすることです。

助けてくれるPesterの専門家はいますか?

答えて

0

あなたは他の関数のようなパイプライン値を受け入れる機能を模擬することができます

Describe "Toggle-Notepad" { 
    Mock Stop-Process { 
     [CmdletBinding()] 
     param(
      [Parameter(ValueFromPipeline = $true)] 
      $InputObject 
     ) 
     return "Process object passed! Stopping notepad" 
    } -ParameterFilter { $InputObject -is "System.Diagnostics.Process" } 

    Mock Start-Process { 
     return "Notepad is not running, starting it!" 
    } -ParameterFilter { $Filepath -eq "Notepad" } 

    It "Starts notepad if it is not running" { 
     Toggle-Notepad | Should be "Notepad is not running, starting it!" 
    } 

    It "Stops notepad if it is running" { 
     Toggle-Notepad | Should be "Process object passed! Stopping notepad!" 
    } 
} 

それは動作しませんので、あなたの嘲笑Stop-Processは、その中にタイプミスがあることにも注意してください。

1

モック内の関数のパラメータがモック内で自動的に作成されるため、通常はMock内のパラメータを手動で定義する必要はありません。

Stop-Processモックが機能しない理由は、-ParamaterFilterプロパティで定義されているためです。定義されたパラメータがtrueの場合にのみ呼び出されるという結果になります。タイプ(角括弧で囲まれている)ではなく、オブジェクトタイプを文字列("System.Diagnostics.Process")として参照しているため、フィルタが機能していません。

モックのための正しいコードは次のとおりです。

Mock stop-process { "Process object passed ! Stopping notepad!" } -ParameterFilter { $InputObject -is [System.Diagnostics.Process[]] } 

I asked this question of the Pester development team directlyと、彼らは、それがその型の有効なオブジェクトが取り込まれていない場合、それはnullになりますようちょうど-ParameterFilter { $InputObject }の簡単な解決策を提案しました。

新MockObject:あなたはどのようなタイプの偽のオブジェクトを作成することができますNew-MockObjectコマンドが今そこにあるせがむ3.4.4以降FYIまた

Describe 'Mocking stop-process' { 

    Mock Stop-Process { 
     Write-Host "Mock stopping: $InputObject" 
    } -ParameterFilter { $InputObject } 

    It 'Should mock stopping the notepad process' { 
     Get-Process notepad | Stop-Process | Should Be $null 
    } 

} 

、:ここで

は完全な例です は、あなたが Pesterモックで実行するほぼすべてのタイプの「擬似」オブジェクトを作成できるPester関数です(Pester 3.4.4で導入されました)。これらの「擬似オブジェクト」は、あなたのモックが同じタイプの を返すことを可能にします。これは厳密に型付けされたエンティティ に結果を渡すためのものです。

あなたのシナリオでは必須ではありませんが、関連性があり興味深いと思うかもしれません。

+0

Saying _ "はparaemtersを定義してはいけません[...]" _は、他の答えを_incorrect_にしません。 – Clijsters

+0

実際には、反射では、私は推測されているコマンドレットの機能にはない追加パラメータを定義できますが、自動的に作成されたパラメータを再定義しないように注意する必要があります。申し訳ありませんが、私は私の答えを修正します。 –

関連する問題