2011-11-20 4 views
6

come testato con PHPUnit:assertEquals e assertTrue danno risultati diversi per le variabili stesse

$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, che cosa?

MODIFICA: No, questa non è una domanda stupida. In 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() 

Nessuna ragione per cui PHP deve comportarsi come Python. Ma non è una domanda stupida neanche in PHP.

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

EDIT 2 risposta di Raymond sotto è giusto, non importa che in questo scritto è di 3 voti verso il basso.

FWIW, Avevo bisogno di un test di confronto tra i valori del nodo di testo di due oggetti XML e l'ho ottenuto lanciandoli su stringhe.

$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

Direi che == verifica l'uguaglianza tra puntatori e assertEquals cerca l'uguaglianza di valore. Ma non ne so abbastanza per saperlo con certezza. Google dovrebbe essere in grado di aiutarti qui –

+0

Aurelio, grazie per l'utile modifica sul titolo. – chernevik

+1

@chernevik Prego. Inoltre ... +1 - questa non è una domanda stupida. –

risposta

4

+1 Questa è una grande domanda.

ho dovuto cercare nella documentazione di PHP per le risposte: http://www.phpunit.de/manual/3.4/en/api.html

L'uguaglianza non è definito per gli oggetti XML Element, in modo che il $this->assertTrue($xml_1==$xml_2); avrà successo solo se i due oggetti hanno la stessa identità (sono lo stesso oggetto).

Al contrario, assertEquals tenta di essere intelligente e ha una gestione caso speciale in base al tipo di oggetto. Nel caso dell'XML, confronta la struttura e il contenuto degli elementi XML, restituendo True se hanno lo stesso significato semantico nonostante siano oggetti distinti.

+0

Thx. Bello sapere che non ero solo io. – chernevik