此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
不起作用。
答案 0 :(得分:1)
因为您正在测试文件系统,我建议您不要使用TestDrive
命令来模拟Testdrive:\
伪造文件系统以进行这些类型的测试。
有关使用15.3.0.4
的详细信息,请参阅http://www.powershellmagazine.com/2014/09/30/pester-mock-and-testdrive/。