double.NaN平等在MS测试
为什么我会得到这个结果?double.NaN平等在MS测试
[TestMethod]
public void nan_test()
{
Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
Assert.AreEqual(1, double.NaN); <-- Fails
}
三角洲声称NaN有什么区别等于一个数字?当然,它总是会返回错误的。我知道IsNaN,但在这里没有用(见下文)。背景:我有一个函数返回NaN(错误地),它的意思是一个实数,但测试仍然通过。我使用的是三角洲,因为它是双精度平等,原始测试使用1E-9。
当您使用Assert.AreEqual(1, double.NaN)
,它试图相等测试在数字上,当然它失败了,因为double.NaN
不等于任何东西。
当你做Assert.AreEqual(1, double.NaN, 1E-1)
,它必须对数字进行算术运算。具体来说,它计算
Math.Abs((double) (expected - actual)) > delta
Math.Abs(1 - double.NaN) > 1E-1
Math.Abs(double.NaN) > 1E-1 // All arithmetic with double.NaN returns double.NaN
double.NaN > 1E-1 // All comparisons with double.NaN return false (except !=)
这是错误的。它看起来像实际增量不大于你通过的delta
,但只是因为它试图表明你不能执行比较。这个故事的寓意:NaN的行为非常疯狂(但最好的一些聪明的人可以提出)。在执行任何计算之前,尽可能检查NaN,在这种情况下,您无法默默地传播错误,就像这样。
很好的解释,谢谢 – RichK 2010-03-26 15:54:01
你可以用NaN代替这个测试吗?
double.IsNaN(somenNumber)
是的,但我不希望我的结果是NaN,如果我只是运行测试而没有用期望的值进行调试,它会通过。不好。 – RichK 2010-03-26 15:45:19
看一看这里:Why does Assert.AreEqual(1.0, double.NaN, 1.0) pass?
编辑:
肯定是有在Assert.AreEqual
的错误。在VS 2008的Microsoft.VisualStudio.QualityTools.UnitTestFramework它的编码为
if (Math.Abs((double) (expected - actual)) > delta)
{
// report error
}
至于你的情况Math.Abs((double) (expected - actual))
是double.NaN
,比较收益率false
:-)
非常好,谢谢。这个问题的OP似乎让问题与我完全一样,很奇怪。 – RichK 2010-03-26 15:44:39
Microsoft bug entry:https://connect.microsoft.com/VisualStudio/feedback/details/762286/unit-test-with-assert-areequal-2-3-double-nan-0-1-passes – jbe 2012-09-12 09:29:09
请参阅也是http://stackoverflow.com/questions/1780004/why-do-mstests-assert-areequal1-0-double-nan-0-0-pass – 2015-01-20 11:30:58