【问题标题】:Pester not mocking function that is dot-sourcedPester 不模拟点源函数
【发布时间】:2016-06-21 17:20:34
【问题描述】:

我正在使用 Pester 测试一个 PowerShell 脚本,该脚本点源另一个脚本。当我尝试模拟点源函数时,Pester 拒绝使用模拟版本。当我尝试通过将函数添加到 .psm1 文件并使用 Import-Module 而不是 dot-sourcing 来获取函数时遇到了同样的问题。

这是一个复制我遇到的问题的示例。所有 3 个文件都在同一个文件夹中。

Foo.ps1

Function Invoke-Foo{
    'Cantelope'
}

Bar.ps1

function Invoke-Bar {
    . .\foo.ps1
    Invoke-foo
}

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'
    }
}

模拟 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

如何让 Pester 正确使用点源函数?

【问题讨论】:

    标签: unit-testing powershell pester


    【解决方案1】:

    Invoke-Bar 从文件中显式点源Invoke-Foo 然后调用 它。点源函数隐藏了其他定义的Invoke-Foo,包括 嘲笑。

    如果我们从 Invoke-Bar 中删除 . .\foo.ps1,那么 Pester 模拟工作,我们得到“香蕉”。

    如果我们删除模拟然后一切正常,即找到所有命令,但我们得到“Cantelope”。

    换句话说,如果您希望Invoke-Foo 可模拟,则不要在Invoke-Bar 中对其进行点源。 Invoke-Bar 应该假定 Invoke-Foo 是预定义的(原始的或模拟的)并使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多