Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Delta no assert

Olá,

Estou com dúvida de como usar o Delta no assert, estou recebendo o seguinte erro: "Failed asserting that 316.66666666666669 matches expected 316.666. ". O meu código está parecido com isso:

$mediaEsperada = 316.666;

$leilao->propoe(new Lance($jonas, 250));

$leilao->propoe(new Lance($joao, 300));

$leilao->propoe(new Lance($jorge, 400));

$this->assertEquals($mediaEsperada, $leiloeiro->getMedia(), 0.00001);

Gostaria de arredondar para que 316.66666666666669 fosse aceito como sendo igual ao número 316.666. Como faço?

Obrigado pela atenção

2 respostas
solução!

Olá Lucas!

Quando tratamos de comparações entre numeros de ponto flutuante (como o double e float) temos uma situação mais delicada pois a propria representação binaria destes tipos é um pouco diferente da representação de numeros inteiros.

Portanto, para tratar de numeros de ponto flutuante, usamos uma sobrecarga da função assertEquals especifica, onde recebemos como parametro uma menssagem de erro caso nosso delta seja menor que a diferença entre os valores do assert. No caso, a syntax fica desse jeito:

assertEquals(float $valor_esperado, float $valor_real,  string $message = 'menssagem de erro', float $delta = 0.1);

No seu exemplo, a diferença entre o valor esperado e o valor real é de 0.000666666667. Portanto, precisamos escolher um delta que seja maior ou igual a este valor. Podemos, por exemplo, usar o valor 0.001.

Então uma boa forma de escrever nosso assertEquals para a comparação dos valores $mediaEsperada e $leiloeiro->getMedia() seria algo como:

$mediaEsperada = 316.666;
$leilao->propoe(new Lance($jonas, 250));
$leilao->propoe(new Lance($joao, 300));
$leilao->propoe(new Lance($jorge, 400));
$this->assertEquals($mediaEsperada, $leiloeiro->getMedia(),"O delta é menor que 0.000666666667", 0.001);

Este caso é um pouco mais especifico mesmo! Você pode verificar todas as formas de assert na documentação do PHPUnit.

Obrigado pelo retorno André, explicação muito bem feita, me ajudou bastante, parabéns.