为什么断言areequal(1.0,double.nan,1.0)通过?
题
简短的问题,为什么 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
, ,在这种情况下返回真实。或不确定。