Pergunta

Curta pergunta, por que Assert.AreEqual(1.0, double.NaN, 1.0) passar? Enquanto Assert.AreEqual(1.0, double.NaN) falha.

É um bug no mstest (Microsoft.VisualStudio.QualityTools.UnittestFramework) ou estou perdendo alguma coisa aqui?

Atenciosamente, Egil.


Atualização: provavelmente deve acrescentar que a razão por trás da minha pergunta é que tenho vários testes de unidade que infelizmente passaram devido ao resultado de alguma operação de matriz algébrica linear sendo NAN ou (+/-) infinito. Os testes de unidade são bons, mas, desde que afirmam. Areeequal em duplas com um delta passará quando real ou/e esperado forem nan ou infinito, fiquei para acreditar que o código que eu estava testando estava correto.

Foi útil?

Solução

Tome cuidado. Nan é estranho, como nulo em muitos DBMSs, e você não deve comparar valores a ele (diretamente ou com assert.areeQual). Dos documentos para Double.nan:

Use ISNAN para determinar se um valor não é um número. Não é possível determinar se um valor não é um número comparando -o com outro valor igual à NAN.

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

Você teria que espiar os internos de Assert (duplo, dobrar, dobrar) para ver o que está acontecendo, mas, em geral, você depende do comportamento indefinido em relação à NAN.

Outras dicas

As respostas estão desatualizadas. Se o bug foi corrigido, quando e em quais versões de qual montagem?

Isso está correto, foi corrigido no vs2013 com o Microsoft.VisualStudio.QualityTools.unittestframework.dll Assembly, versão 10.0.0.0. Presente no Legacy GAC, C: Windows Assembly, ele também possui a versão 10.1.0.0.

Há uma história do DLL Hell aqui, a versão 10.1.0.0 foi a usada no VS2010. Tinha o bug, não checando corretamente o double.nan. A Microsoft cometeu um erro, eles corrigiram 10.1.0.0, mas não alteraram o número da versão. Então, qualquer pessoa que instalou o VS2010 depois A instalação do VS2013 vai se machucar, ele substituirá a DLL com a versão de buggy.

Desvendar o inferno da dll nunca é tão simples, mas parece do Artigo de conexão E pela maneira como funciona na minha máquina, eles identificaram o modo de falha a partir da reclamação do cliente. E forneceu uma correção, entregue em uma atualização. Não está claro qual, depois de julho de 2014. Você usará agora v10.0.0.0, o MSTEST.EXE TEST RUNNER e os Qtagents têm um arquivo .config com um <bindingRedirect> Isso redireciona de 10.1.0.0 para 10.0.0.0 (não é um erro de digitação). Certifique -se de obter a atualização mais recente, atualmente 4. Procure Help + sobre se você não tiver certeza de qual atualização instalou.

Para o registro, o código fixo adquiriu verificações específicas para o double.nan, parece o seguinte:

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 usa a seguinte fórmula para o Assert.AreEqual<double>(expected, actual, delta) método:

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

A operação reduz para double.NaN > delta, que retorna verdadeiro neste caso. Ou indefinido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top