我正在使用NUnit来验证某些代码并在报告有用信息时出现问题。我的测试大致如下:
Assert::IsTrue(myClassInstance.SomeMethodToTest(), "Test failed: {0}", myClassInstance.LastError);
问题是在测试方法之前评估LastError
属性,因此最后一个错误是空白的。
有没有办法延迟评估最后一个错误,为函数提供更有意义的输出?
答案 0 :(得分:1)
嗯,这是一个很大的失败,但你在这里调用未定义的行为。 NUnit最初是为Java设计的,非常适合C#和VB.NET。在语言规范中承诺严格的从左到右函数参数评估顺序的语言。因此Assert.IsTrue()
方法在这些语言中具有明确定义的行为。
但不是在C ++ / CLI中,它利用了C ++中的UB规则。毫无疑问,受第三个参数的[ParamArray]的启发,它首先在评估其他参数之前对其进行抛光。你得到从右到左的顺序。从臀部开始,我会说这与varargs仿真有关。
不太确定要推荐什么,在UB附近航行是非常棘手的。从技术上讲,您可以使用一个或多个Object ^参数提供自己的Assert::IsTrue()
重载。编译器将选择那些而不是[ParamArray]重载。或者完全避免[ParamArray]重载并使用String::Format()
生成消息参数。你现在从左到右。那个仍然是 UB但是,它看起来没问题,但我不能保证这将适用于每一组可能的参数表达式。