2011-11-20 13 views
6

como puede comprobarse con PHPUnit:assertEquals y assertTrue dan resultados diferentes para mismas variables

$xml_1 = new SimpleXMLElement('<name>Bugs</name>'); 
$xml_2 = new SimpleXMLElement('<name>Bugs</name>'); 

$this->assertEquals($xml_1, $xml_2); // Passes 
$this->assertTrue($xml_1==$xml_2);  // Fails 

Um, ¿qué?

EDITAR: No, esta no es una pregunta estúpida. En Python:

import unittest 
class TestEqualityIdentity(unittest.TestCase): 
def test_equality(self): 
    x = 1 
    y = 1 
    self.assertTrue(x==y)  # Passes 
    self.assertEqual(x, y)  # Passes 
if __name__ == '__main__': 
    unittest.main() 

No hay razón para que PHP se comporte como Python. Pero tampoco es una pregunta estúpida en PHP.

$x = 1; 
$y = 1; 
$this->assertEquals($x, $y);  // Passes 
$this->assertTrue($x==$y);   // Passes 

EDIT 2 respuesta de Raymond continuación es correcto, no importa que en este escrito es 3 votos hacia abajo.

FWIW, Necesitaba una comparación de prueba si de los valores del nodo de texto de dos objetos XML, y lo obtuve fundiéndolos en cadenas.

$this->assertTrue((string) $xml_1== (string) $xml_2); // Passes, works in if test 

// Note that simply referring to a SimpleXMLElement _seems_ to give its 
// text node. 

$this->assertEquals($xml_1, 'Bugs'); // Passes 

// This seemed weird to me when I first saw it, and I can't 
// say I like it any better now 
+0

Supongo que == prueba la igualdad del puntero, y assertEquals busca la igualdad del valor. Pero no sé lo suficiente como para saberlo con certeza. Google debería poder ayudarte aquí –

+0

Aurelio, gracias por la útil edición del título. – chernevik

+1

@chernevik De nada. Además ... +1 - esta no es una pregunta estúpida. –

Respuesta

4

+1 Esta es una gran pregunta.

tuve que buscar en la documentación de PHP para las respuestas: http://www.phpunit.de/manual/3.4/en/api.html

La igualdad no se define para los objetos elemento XML, por lo que el $this->assertTrue($xml_1==$xml_2); sólo tendrá éxito si los dos objetos tienen la misma identidad (son el mismo objeto)

Por el contrario, assertEquals intenta ser inteligente y tiene manejo de mayúsculas y minúsculas especiales según el tipo de objeto. En el caso de XML, compara la estructura y el contenido de los elementos XML, y devuelve True si tienen el mismo significado semántico aunque sean objetos distintos.

+0

Thx. Es bueno saber que no fui solo yo. – chernevik

Cuestiones relacionadas