1

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

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

我试图通过模拟 Get-ChildItem 和 Select-String 来编写 Pester 单元测试,但遇到了问题。这是两次以相同方式失败的尝试。第一个测试使用 Mock'sparameterFilter来区分,而第二个测试在其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 似乎能够从 Path 参数的 FileInfo 对象数组中映射 FullName(尽管我找不到这样做的参数别名)。

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

4

1 回答 1

1

由于您正在针对文件系统进行测试,因此我建议您不要模拟Get-ChildItem您使用的命令TestDrive来伪造文件系统以进行此类测试。

有关使用Testdrive:\. _

于 2015-06-16T14:37:10.393 回答