此 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
在任一模拟中都不起作用。