jge*_*sky 4 powershell unit-testing pester
我正在使用 Pester 测试一个 PowerShell 脚本,该脚本点源另一个脚本。当我尝试模拟点源函数时,Pester 拒绝使用模拟版本。当我尝试通过将函数添加到 .psm1 文件并使用 Import-Module 而不是点源来获取函数时,我遇到了同样的问题。
这是一个复制我遇到的问题的示例。所有 3 个文件都在同一个文件夹中。
文件.ps1
Function Invoke-Foo{
'Cantelope'
}
Run Code Online (Sandbox Code Playgroud)
酒吧.ps1
function Invoke-Bar {
. .\foo.ps1
Invoke-foo
}
Run Code Online (Sandbox Code Playgroud)
Bar.tests.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"
. .\Foo.ps1
Describe "Bar" {
It "Mocks Foo" {
Mock Invoke-Foo {'Banana'}
Invoke-Bar | should be 'Banana'
}
}
Run Code Online (Sandbox Code Playgroud)
在模拟 Invoke-Foo 之后,结果应该是 'Banana',但结果是:
Describing Bar
[-] Mocks Foo 36ms
Expected string length 6 but was 9. Strings differ at index 0.
Expected: {Banana}
But was: {Cantelope}
-----------^
9: Invoke-Bar | should be 'Banana'
at <ScriptBlock>, C:\Users\geinosky\Desktop\PingTest\Bar.tests.ps1: line 9
Run Code Online (Sandbox Code Playgroud)
如何让 Pester 正确使用点源函数?
Invoke-BarInvoke-Foo从文件中显式点源,然后调用它。点源函数隐藏了其他定义的Invoke-Foo,包括模拟的。
如果我们. .\foo.ps1从中删除Invoke-BarPester 模拟工作,我们会得到“香蕉”。
如果然后我们删除模拟然后所有工作,即找到所有命令,但我们得到“Cantelope”。
换句话说,如果你想Invoke-Foo被嘲笑,那么不要在Invoke-Bar.
Invoke-Bar应该假设Invoke-Foo是预定义的(原始的或模拟的)并使用它。
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |