如何使用Pagle Pester处理流水线命令

时间:2014-08-01 23:50:34

标签: unit-testing powershell pester

此PowerShell函数标识包含特定字符串的文件:

function GetFilesLackingItem([string]$pattern)
{
    Get-ChildItem | ? { !( Select-String -pattern $pattern -path $_ ) }
}

我试图通过模拟Get-ChildItem和Select-String来编写Pester单元测试,但遇到了问题。以下两次尝试都以同样的方式失败。第一个测试使用Mock的parameterFilter进行区分,而第二个测试则在mockCommand本身添加逻辑来执行此操作。

Describe "Tests" {
    $fileList = "nameA", "nameB", "nameC", "nameD", "nameE" | % {
        [pscustomobject]@{ FullName = $_; }
    }
    $filter = '(B|D|E)$'
    Mock Get-ChildItem { return $fileList }

    It "reports files that did not return a match" {
        Mock Select-String { "matches found" }  -param { $Path -match $filter }
        Mock Select-String 

        $result = Get-ChildItem | ? { !(Select-String -pattern "any" -path $_) }

        $result[0].FullName | Should Be "nameA"
        $result[1].FullName | Should Be "nameC"
        $result.Count | Should Be 2
    }

    It "reports files that did not return a match" {
        Mock Select-String {
            if ($Path -match $filter) { "matches found" } else { "" }
            }

        $result = Get-ChildItem | ? { !(Select-String -pattern "any" -path $_ ) }

        $result[0].FullName | Should Be "nameA"
        $result[1].FullName | Should Be "nameC"
        $result.Count | Should Be 2
    }
}

如果我修改测试,使Select-String -path参数为$_.FullName而不是$_,则两个测试都会通过。但是在现实生活中(例如,如果我没有模拟运行线条)它只能$_正常工作。 (它也适用于$_.FullName。)因此,真正的Select-String似乎能够从PathInfo对象的数组中映射FullName以获取Path参数(尽管我找不到有参数别名来执行此操作)

我的问题:是否可以保留原始代码,即将Path参数保留为$_在测试行上,并修改Select-String模拟而不是提取FullName属性?例如,尝试使用模拟中的$Path.FullName不起作用。

1 个答案:

答案 0 :(得分:1)

因为您正在测试文件系统,我建议您不要使用TestDrive命令来模拟Testdrive:\伪造文件系统以进行这些类型的测试。

有关使用15.3.0.4的详细信息,请参阅http://www.powershellmagazine.com/2014/09/30/pester-mock-and-testdrive/