Почему Assert.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 или (+/-) бесконечность. Модульные тесты в порядке, но, поскольку Assert.areequal on Doubles с дельтой пройдет, когда фактические или/и ожидаемые - NAN или Infinity, мне осталось полагать, что код, который я тестировал, был правильным.
Решение
Будь осторожен. Нэн странная, что -то вроде нулевого во многих СУБД, и вы не должны сравнивать с ним ценности (напрямую или с 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.
Другие советы
Ответы устарели. Если ошибка была исправлена, когда и в каких версиях какой сборки?
Это правильно, это было исправлено в VS2013 с помощью Microsoft.visualStudio.qualityTools.UnittestFramework.dll, версия 10.0.0.0. Присутствует в устаревшем GAC, C: Windows Assembly, он также имеет версию 10.1.0.0.
Здесь есть история ада DLL, версия 10.1.0.0 была использована в VS2010. У него была ошибка, не проверяя Double.nan. Microsoft допустила ошибку, они исправили 10.1.0.0, но не изменили номер версии. Итак, любой, кто установил VS2010 после Установка VS2013 пострадает, она будет перезаписать DLL с помощью версии Buggy.
Развращение DLL Hell никогда не бывает так просто, но он появляется из Подключить статью И из того, как он работает на моей машине, они определили режим сбоя из жалобы клиента. И предоставил исправление, доставленное в обновлении. Не ясно, что после июля 2014 года вы теперь используете V10.0.0.0, тестовый бегун MSTest.exe и Qtagents имеют файл .config с <bindingRedirect>
Это перенаправляет с 10.1.0.0 на 10.0.0.0 (не опечатка). Обязательно получите последнее обновление, в настоящее время 4. Посмотрите на помощь + о том, не уверены ли вы, какое обновление вы установили.
Для записи фиксированный код приобрел конкретные проверки для 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
, что возвращает истину в этом случае. Или не определен.