简短的问题,为什么 Assert.AreEqual(1.0, double.NaN, 1.0) 经过?然而 Assert.AreEqual(1.0, double.NaN) 失败。

它是mstest中的错误(Microsoft.visualstudio.qualitytools.unittestframework)还是我在这里错过了一些东西?

最好的问候,埃吉尔。


更新:应该补充说,我的问题背后的原因是,由于某些线性代数矩阵操作为NAN或(+/-)Infinity,我进行了大量的单元测试。单位测试很好,但是由于assert.areequal在双打上进行三角洲的销售时,当实际或/和预期的是nan或infinity时,我被认为我正在测试的代码是正确的。

有帮助吗?

解决方案

当心。 NAN很奇怪,在许多DBMS中有点像无效,您不应该将值(直接或与assert.areequal)进行比较。从文档 double.nan:

使用isnan来确定值是否不是数字。不可能通过将值与等于NAN的另一个值进行比较来确定值是否不是数字。

double zero = 0;
Console.WriteLine((0 / zero) == Double.NaN);  // prints false
Console.WriteLine(Double.IsNaN(0 / zero));  // prints true

您必须在断言的内部(双重,双重,双重)的内部观看发生了什么,但总的来说,您取决于相对于NAN的不确定行为。

其他提示

答案是过时的。如果该错误已修复,什么时候以及哪个版本的哪个组件?

没错,它是用Microsoft.visualstudio.qualitytools.unittestframework.dll Assembly在VS2013中修复的,版本10.0.0.0。存在于旧版GAC中,C: Windows Assembly,它还具有10.1.0.0版本。

这里有一个DLL地狱故事,10.1.0.0版本是VS2010中使用的版本。它有错误,无法正确检查double.nan。微软犯了一个错误,他们修复了10.1.0.0,但没有更改版本号。因此,任何安装VS2010的人 安装VS2013将受到伤害,它将用Buggy版本覆盖DLL。

解开dll地狱从来都不那么简单,但是从 连接文章 从我的计算机上工作的方式,他们从客户的投诉中确定了故障模式。并提供了一个修复程序,并在更新中交付。尚不清楚2014年7月之后的哪个 <bindingRedirect> 从10.1.0.0重定向到10.0.0.0(不是错字)。请务必获取当前的最新更新。

对于记录,固定的代码获得了Double.nan的特定检查,看起来像这样:

public static void AreEqual(double expected, double actual, double delta, string message, params object[] parameters)
{
    if ((double.IsNaN(expected) || double.IsNaN(actual)) || double.IsNaN(delta))
    {
        string str = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str, parameters);
    }
    if (Math.Abs((double) (expected - actual)) > delta)
    {
        string str2 = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str2, parameters);
    }
}

mstest使用以下公式进行 Assert.AreEqual<double>(expected, actual, delta) 方法:

if (Math.Abs(expected - actual) > delta)
    Assert.HandleFail("Assert.AreEqual", ...)

该操作减少了 double.NaN > delta, ,在这种情况下返回真实。或不确定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top