2011-11-20 94 views
6

不同的結果與PHPUnit的測試:的assertEquals和assertTrue給出了相同的變量

$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 

嗯,什麼?編輯: 不,這不是一個愚蠢的問題。在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() 

沒理由PHP需要表現得像Python一樣。但是,這在PHP中也不是一個愚蠢的問題。

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

EDIT 2 雷蒙德的下面答案是正確的,不要介意在寫這篇文章是3票了。

FWIW,我需要一個if測試比較兩個XML對象的文本節點值,並通過將它們轉換爲字符串得到它。

$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

我會猜測==測試指針相等,並且assertEquals查找值相等。但我無法確切地知道。谷歌應該能夠在這裏幫助你 –

+0

奧雷利奧,感謝您對標題的有用編輯。 – chernevik

+1

@chernevik不客氣。除此之外...... +1 - 這不是一個愚蠢的問題。 –

回答

4

+1這是一個很好的問題。

我曾在PHP文件來尋找答案:http://www.phpunit.de/manual/3.4/en/api.html

平等不是爲XML元素對象定義的,所以$this->assertTrue($xml_1==$xml_2);纔會成功,如果兩個對象具有相同的身份(是同一個對象)。

相比之下,assertEquals嘗試變得智能,並根據對象類型進行特殊情況處理。在XML的情況下,它比較XML元素的結構和內容,如果它們具有相同的語義含義,則返回True,儘管它們是不同的對象。

+0

Thx。很高興知道這不僅僅是我。 – chernevik

相關問題