【问题标题】:Mocking class functions with Pester 5 and PowerShell 7使用 Pester 5 和 PowerShell 7 模拟类函数
【发布时间】:2020-12-08 22:37:00
【问题描述】:

有人有使用 Pester 5 和 PowerShell 7 模拟点源类函数的示例吗?

谢谢。

编辑:示例

类\MyClass.ps1:

class MyClass {
    [void] Run() {
        Write-Host "Class: Invoking run..."
    }
}

MyModule.psm1:

# Import classes
. '.\Classes\MyClass.ps1'

# Instantiate classes
$MyClass = [MyClass]::new()

# Call class function
$MyClass.Run()

【问题讨论】:

  • 是的,the docs have plenty。有什么具体的你在苦苦挣扎的吗?
  • 嘿,是的 - 我可以毫无问题地模拟大多数事情。它是在类中定义的具体函数。
  • 类方法中定义的函数仍然只是函数。你想模拟一个类方法吗?
  • 是的,正确。我的措辞不好。在原q中提供了一个例子。
  • 不用担心,例子说明了:)

标签: powershell pester


【解决方案1】:

Pester 只模拟 命令 - 而不是类或它们的方法。

“模拟”用于方法分派测试的 PowerShell 类的最简单方法是利用 PowerShell 标记所有方法 virtual 的事实,从而允许派生类覆盖它们:

class MockedClass : MyClass
{
  Run() { Write-host "Invoking mocked Run()"}
}

这种方法的好处在于,将输入限制为 MyClass 类型的函数仍可用于模拟类型:

function Invoke-Run
{
  param([MyClass]$Instance)

  $instance.Run()
}

$mocked = [MockedClass]::new()
Invoke-Run -Instance $mocked    # this still works because [MockedClass] derives from [MyClass]

【讨论】:

  • 你如何让 Pester 知道 MyClass 是什么? class MockedClass : MyClass。现在 Pester 正在返回Unable to find type [MyClass]
  • @XeonFibre 要么在测试脚本文件中添加一个using module ModuleContainingClassDef 指令,要么定义与Invoke-Expression 内联的类(即iex 'class MockedClass : ...'
  • 您是否知道如何使用 Mock ... -Verifiable 与您的解决方案?然后我可以确保调用了模拟方法。
  • 我运气不太好,但没关系,我将创建一些接口并改为走那条路。它将使我能够验证函数是否被正确调用并且测试应该更短。
猜你喜欢
  • 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
相关资源
最近更新 更多