Double.Nan Igualdade no teste de MS
Pergunta
Por que estou obtendo esse resultado?
[TestMethod]
public void nan_test()
{
Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
Assert.AreEqual(1, double.NaN); <-- Fails
}
Que diferença o delta tem em afirmar que a NAN é igual a um número? Certamente deve sempre retornar falso. Estou ciente de Isnan, mas isso não é útil aqui (veja abaixo).
Antecedentes: Eu tenho uma função retornando NAN (erroneamente), era para ser um número real, mas o teste ainda foi aprovado. Estou usando o Delta porque é uma igualdade de precisão dupla, o teste original usado 1E-9.
Solução
Quando você usa Assert.AreEqual(1, double.NaN)
, tenta um teste de igualdade nos números e, é claro, falha, pois double.NaN
não é igual a nada.
Quando você faz Assert.AreEqual(1, double.NaN, 1E-1)
, ele tem que fazer aritmética nos números. Especificamente, ele calcula
Math.Abs((double) (expected - actual)) > delta
Math.Abs(1 - double.NaN) > 1E-1
Math.Abs(double.NaN) > 1E-1 // All arithmetic with double.NaN returns double.NaN
double.NaN > 1E-1 // All comparisons with double.NaN return false (except !=)
o que é falso. Isto parece como o delta real não é maior que o delta
Você passou, mas apenas porque está tentando indicar que você não pode executar a comparação.
Moral da história: o comportamento de Nan é muito louco (mas as melhores pessoas inteligentes podem criar). Faça o seu melhor para verificar a NAN antes de executar quaisquer cálculos em que você não pode ter o erro se propagar silenciosamente, como este.
Outras dicas
Dê uma olhada aqui: Por que assert.areeeQual (1.0, duplo.nan, 1.0) passa?
Editar:
Definitivamente há um bug em Assert.AreEqual
. no Microsoft.VisualStudio.QualityToolTools.UnittestFramework, é codificado como codificado como
if (Math.Abs((double) (expected - actual)) > delta)
{
// report error
}
Como no seu caso Math.Abs((double) (expected - actual))
é um double.NaN
, a comparação produz false
:-)
Você poderia usar este teste para NAN?
double.IsNaN(somenNumber)