powershell - 如何在 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。
解决方案
我对带有参数检查的 Pester 测试有同样的问题/问题;总是很难追踪哪个参数可能使给定-ParameterFilter
表达式失败。
它已在几个 GitHub 问题中提出:
但似乎还没有任何决议或共识。如果可以的话,我会尝试添加到那里的对话中。
一位用户谈到制作一个在调用中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
语句失败来知道哪个参数失败了。但是,如果在函数中多次调用模拟,这种方法就不能很好地工作。