有没有办法用 NUnit 延迟评估伴随错误输出的字符串?

Is there a way to delay evaluation of the string accompanying error output with NUnit?

我正在使用 NUnit 验证一些代码,但在报告有用信息时遇到了问题。我的测试按照以下几行进行:

Assert::IsTrue(myClassInstance.SomeMethodToTest(), "Test failed: {0}", myClassInstance.LastError);

问题是 LastError 属性 在测试方法之前进行评估,所以最后一个错误是空白。

是否有任何方法可以延迟对最后一个错误的评估,从而为函数提供更有意义的输出?

好吧,这真是太可惜了,但是您在这里调用了未定义的行为。 NUnit 最初是为 Java 设计的,很好地移植到 C# 和 VB.NET。在其语言规范中承诺严格的从左到右的函数参数评估顺序的语言。因此 Assert.IsTrue() 方法在这些语言中具有明确定义的行为。

但在 C++/CLI 中没有,它利用了 C++ 中的 UB 规则。无疑受到第三个参数的 [ParamArray] 的启发,它在评估其他参数之前首先擦掉那个参数。你得到从右到左的顺序。开玩笑,我会说这与 varargs 仿真有关。

不太确定推荐什么,在 UB 周围航行永远是棘手的。从技术上讲,您可以使用一个或多个 Object^ 参数提供您自己的 Assert::IsTrue() 重载。编译器将选择那些而不是 [ParamArray] 重载。或者完全避免 [ParamArray] 重载并使用 String::Format() 生成 message 参数。你现在将从左到右。那是 still UB 然而,它看起来不错,但我不能保证这将适用于所有可能的参数表达式集。

哎呀,对不起。