在使用Pester测试我的PowerShell脚本时,如何模拟Out-File?

时间:2016-10-24 14:32:31

标签: unit-testing powershell pester

我正在尝试使用Pester测试我的PowerShell代码。我想模仿out-file以下一行:

$interactiveContent | Out-File -Append -FilePath (Join-Path $destDir $interactiveOutputFile)

但我想在测试时提供自己的文件路径。

我尝试了以下内容:

Mock Out-File {
    $destDir = 'c:\snmp_poc_powershell\'
    $interactiveOutputFile = 'abc.csv'  
}

但它不起作用。

2 个答案:

答案 0 :(得分:4)

这是一种模拟Out-File的方法,使其在运行测试时写入不同的位置:

Describe 'Mocking out-file' {

    $outFile = Get-Command Out-File

    Mock Out-File { 
        $MockFilePath = '.\Test\Test.txt'
        & $outFile -InputObject $InputObject -FilePath $MockFilePath -Append:$Append -Force:$Force -NoClobber:$NoClobber -NoNewline:$NoNewline 
    }

    It 'Should mock out-file' {
        "Test" | Out-File -FilePath Real.txt -Append | Should Be $null
    }

}

这个解决方案来自Pester的开发人员,我在Github上将其作为issue提出。我发现你不能直接调用你在模拟中模拟的cmdlet,但他们建议使用Get-Command将cmdlet放入变量然后使用{{1} }直接调用它而不是cmdlet。

根据另一个答案,&没有返回任何值,因此在Pester测试中我们只测试Out-File作为结果。您可能还希望添加后续(集成式)测试,测试文件已创建并具有您期望的值。

答案 1 :(得分:0)

所以代码片段肯定是个问题,你没有返回任何值,所以mock只是为空,但out-file实际上从未实际返回任何内容,所以我不确定你在嘲笑什么输出?除非你只是想让它假装输出到一个文件并移动到你当前代码所做的管道的下一个阶段(所以只会做Mock Out-File {}

但是,如果您希望输出到不同的路径,为什么不在为测试创建变量时使用该路径而不打扰Mock?