首页 > 解决方案 > 如何在 Pester 中“获取调用的参数”(或生成包含实际值和预期值的有用消息)?

问题描述

虽然有很多使用 Pester断言 Mock的示例,但我无法找到关于如何使用 Pester 获取 Mock 上的参数的好的(或任何)示例;这对于获取有意义的错误消息而不是一般的通用消息很有用:

预计 Invoke-XYZ 至少被调用 1 次但被调用 0 次

谢谢,很明显;也可能是一个“不起作用”的问题。

例如,在 RhinoMocks + NUnit (C#) 中,可以使用类似于以下的代码来断言调用了 mock并且参数符合某些条件。如果进行了调用并且参数匹配,则会显示有用的断言消息:

var actual = mock.GetArgumentsForCallsMadeOn(m => ..);
Assert.That(actual, Is.EqualTo(expected));

在 Pester 中如何实现相同(或相似)?

目标是使失败的模拟断言导致有用的错误消息,说明哪些特定参数未达到预期,以及具有什么值。

PowerShell 是 5.1,Pester 是 4.8.1。

标签: powershellunit-testingmockingpester

解决方案


我对带有参数检查的 Pester 测试有同样的问题/问题;总是很难追踪哪个参数可能使给定-ParameterFilter表达式失败。

它已在几个 GitHub 问题中提出:

  1. https://github.com/pester/Pester/issues/376
  2. https://github.com/pester/Pester/issues/1160

但似乎还没有任何决议或共识。如果可以的话,我会尝试添加到那里的对话中。

一位用户谈到制作一个在调用中Assert-MockCalled调用的验证函数:

It 'multiple expressions, second line' {
    Assert-MockCalled f 1 {
        ($a -eq 1 | Verify) -and
        ($b -eq 1 | Verify) -and
        ($b-1 -eq $a | Verify)
    }
}

这提供了更好的输出,但这是解决此问题的一种 hacky/verbose 方式。

就个人而言,我的解决方法是编写多个Assert-MockCalled语句,每个语句都有一个-ParameterFilter只检查一个参数的表达式,这样我就可以根据哪个Assert-MockCalled语句失败来知道哪个参数失败了。但是,如果在函数中多次调用模拟,这种方法就不能很好地工作。


推荐阅读