问题描述
我正在使用 pester 测试我的自定义 cmdlet。测试是启动环境的端到端测试;编译和加载程序集并对动态编译的代码执行测试。
我需要在新的 PowerShell 进程中进行实际测试(以便每次都可以编译和加载程序集),因此我使用 start-job 在后台使用 start-job
运行测试并等待receive-job -wait
的结果。像这样:
Describe 'Run' {
It 'StartJobTest' {
start-job -script {invoke-pester .\MyTests.Tests.ps1} | receive-job -wait
}
}
一切正常,除了我无法从作业返回任何测试成功或失败状态,以便可以将调用 pester 测试标记为成功或失败。
有谁知道如何实现这一目标。我尝试设置 $global:pesterPreference.Run.Exit = $true
但这没有任何区别。
感谢收到任何帮助或建议,
大卫
解决方法
我认为您需要使用 -PassThru 开关:
返回包含测试结果的自定义对象 (PSCustomObject)。默认情况下,Invoke-Pester 写入主机程序,而不是输出流 (stdout)。如果您尝试将结果保存在变量中,则该变量为空,除非您使用 PassThru
参数。
Describe 'Run' {
It 'StartJobTest' {
$Results = Start-Job -Name Invoke-Pester -ScriptBlock {
Invoke-Pester -Path '.\MyTests.Tests.ps1' -PassThru
} | Receive-Job -Wait -AutoRemoveJob
$Results.FailedCount | Should -BeExactly 0
}
}
附言在 Pester v5 中,此开关替换为 ConfigurationProperty
Run.PassThru
:https://pester.dev/docs/migrations/v4-to-v5