Вопрос

Краткий вопрос, почему 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, что возвращает истину в этом случае. Или не определен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top