3

我正在使用 Pester,一个 PowerShell 测试库来帮助 TDD/单元测试覆盖。

我正在尝试模拟 Get-ChildItem 以进行我在应该进行环境设置的模块中的测试。如果我让我的模拟 Get-ChildItem 函数返回一个纯字符串,它工作正常,但如果我让它返回这个数组,它不会返回任何东西。

Describe "Get-HighestBuildNumber" {
    Context "Get-ChildItem mocked to returns 12345, 12346, 12348, Foobar12349" {
        $directory1 = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList "12345"
        $directory2 = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList "12346"
        $directory3 = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList "12348"
        $directory4 = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList "Foobar12349"
        $fakeListingOfDirectories = @( $directory1, $directory2, $directory3, $directory4 )
        Mock -ModuleName EnvironmentSetup Get-ChildItem { 
            #return "this return text works" #this works
            return $fakeListingOfDirectories #this return array does not work
        }
        it "should return 12348" {
            Get-HighestBuildNumber -buildRoot "C:\my\test\directory" | Should Be "12348"
        }
    }
}

在被测代码中,我设置了一个断点并调用了模拟的 Get-ChildItem 并且可以看出有些不同。

当使用字符串模拟调用它时 - 一切都很好。

当使用数组模拟调用它时 - 它什么也不返回,甚至不返回文件和目录的标准列表。所以看起来模拟正在做某事。

我试图弄清楚为什么 Get-ChildItem 没有返回我的 DirectoryInfo 项目数组。

谢谢!

编辑:当我改变时:

Mock -ModuleName EnvironmentSetup Get-ChildItem { 
    return $fakeListingOfDirectories #this return array does not work
}

返回不同的文字:

Mock Get-ChildItem -ModuleName NavEnvironmentSetup { return @{Name = "12345"}, @{Name = "12346" }, @{Name = "12348"}, @{Name = "Foobar12349"} } 

我被测系统中的调用开始返回预期值,与返回纯字符串相同。

使用前导逗号不起作用,并且投射应该是呼叫也不起作用。

4

2 回答 2

1

投射到 System.IO.DirectoryInfo 怎么样

Get-HighestBuildNumber -buildRoot "C:\my\test\directory" | Should Be @([System.IO.DirectoryInfo]"12348")

或使用“名称”属性

return $fakeListingOfDirectories.Name

?

于 2015-12-09T02:28:04.877 回答
1

我不在可以测试它的机器上,但Mock {}脚本块可能与脚本块不在同一范围内Describe {}。我会Describe{}像这样重写你的块:

Describe "Get-HighestBuildNumber" {
    Context "Get-ChildItem mocked to returns 12345, 12346, 12348, Foobar12349" {
        Mock -ModuleName EnvironmentSetup Get-ChildItem { 
            @( 
                "12345","12346","12348","Foobar12349" | 
                    % { New-Object System.IO.DirectoryInfo($_) }
            )
        }
        it "should return 12348" {
            Get-HighestBuildNumber -buildRoot "C:\my\test\directory" | Should Be "12348"
        }
    }
}
于 2015-12-10T02:19:27.850 回答