1

Pester のテストをしようとしているのですが、奇妙なエラー "A positional parameter cannot be found" (プライベート Python コマンドレットの場合) が表示されます。これは Pester の制限ですか、それとも以下のコードに何か問題がありますか?

TestModule.psm1コード:

#public function:
Function Create-Db 
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [string]$database
    )

    Python 'Files\create_db.py' '--DBMS=SQLSERVER -d $database'
}

#private (not exported) function:
Function Python
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory, Position=1)]
        [string]$scriptFile,
        [Parameter(Position=2)]
        [string]$args
    )

    $python ='C:\Python27\python.exe'
    Push-Location $PSScriptRoot

    $python = Start-Process -FilePath $python -ArgumentList @($scriptFile,$args) -Wait -NoNewWindow -PassThru
    if($python.ExitCode -ne 0)
    {
        throw "Python script", $scriptFile, "failed"
    }

    Pop-Location
}

関数の Pester コード:

$scriptDirectory = (Split-Path -Parent $MyInvocation.MyCommand.Path) -replace "Test$"
Import-Module $scriptDirectory\TestModule.psm1 -Force

Describe "Create-Db test" {
    Context "Create database" {

        Mock -ModuleName TestModule Python -Verifiable { return; }
        Create-Db -database "test_database"

        It "Python has been called" {
            Assert-VerifiableMocks
        }
    }
}

テストコードを実行すると、次のエラーが発生します。

Create-Db テストの説明
   コンテキスト データベースの作成
    [-] Context ブロック 1.35 秒でエラーが発生しました
      ParameterBindingException: 引数 '--DBMS SqlServer -d test_database' を受け入れる位置パラメーターが見つかりません。
      Test-ParameterFilter で、C:\Program Files\WindowsPowerShell\Modules\Pester\3.3.14\Functions\Mock.ps1: 行 1086
4

1 に答える 1

4

$args非高度な関数にバインドされていないすべての引数を含む自動変数です。そして、それはペスターによってそのように解釈されます。モックされたコマンドが呼び出されると、Pesterは渡された引数の表示としてキャプチャ$PSBoundParametersします。$argsその後、Pester splat はパラメータ フィルタ ルーチンに値をキャプチャしました。

コードの「バグ」$argsは、関数の通常のパラメーターとして使用し、Pester を混乱させることです。嘲笑さPythonれると、ペスターは次のことを確認します。

$PSBoundParameters = @{
    scriptFile = 'Files\create_db.py'
    args = '--DBMS=SQLSERVER -d $database'
}
$args = '--DBMS=SQLSERVER -d $database'

その後、Pester は、そのような引数と同等のパラメーター フィルター スクリプトを呼び出します。

-scriptFile: 'Files\create_db.py' -args: '--DBMS=SQLSERVER -d $database' '--DBMS=SQLSERVER -d $database'

パラメータ フィルタ スクリプトは、位置引数 を受け入れることができるパラメータを定義していないため、'--DBMS=SQLSERVER -d $database'取得したのはParameterBindingExceptionです。

このような動作は、おそらく Pester のバグと呼ぶことができます。高度な機能は$args自動変数を設定しないため、そもそもキャプチャしないでください。Pester には、親スコープからキャプチャしないための保護が既にあります。高度な機能やコマンドレットをモックするときに$argsキャプチャしないように追加の保護が必要なだけです。$args

$argsただし、通常のパラメーターとして使用しないでください。パラメータ名を次のように変更してエイリアスとしてArguments使用することをお勧めします。Args

[Parameter(Position=2)]
[Alias('Args')]
[string]$Arguments
于 2016-02-15T10:50:40.500 に答える