在MS测试中的双重平等

时间:2010-03-26 15:35:04

标签: c# mstest nan

为什么我得到这个结果?

[TestMethod]
public void nan_test()
{
    Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
    Assert.AreEqual(1, double.NaN);       <-- Fails
}

三角洲在断言NaN等于一个数字方面有什么不同?当然它应该总是返回假。我知道IsNaN,但这在这里没用(见下文)。

背景:我有一个函数返回NaN(错误地),它本来是一个实数,但测试仍然通过。我正在使用delta,因为它是双精度相等,原始测试使用1E-9。

3 个答案:

答案 0 :(得分:4)

当你使用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不大于你传递的delta,但只是因为它试图表明你无法进行比较。

故事的道德:NaN的行为非常疯狂(但最好的一些聪明的人可以提出)。在执行任何无法以无声方式传播错误的计算之前,请尽力检查NaN,如此。

答案 1 :(得分:2)

看看这里: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: - )

答案 2 :(得分:1)

您可以将此测试用于NaN吗?

double.IsNaN(somenNumber)