assertEquals和assertTrue为相同的变量提供不同的结果

时间:2011-11-20 03:04:51

标签: php phpunit

用phpunit测试:

$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

编辑2 雷蒙德在下面的回答是正确的,不要紧,在写这篇文章时它会下降3票。

FWIW,我需要对两个XML对象的文本节点值进行if测试比较,并通过将它们转换为字符串来获得它。

$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

1 个答案:

答案 0 :(得分:4)

+1这是一个很好的问题。

我必须在PHP文档中查找答案:http://www.phpunit.de/manual/3.4/en/api.html

没有为XML Element对象定义Equality,因此只有当两个对象具有相同的标识(是同一个对象)时,$this->assertTrue($xml_1==$xml_2);才会成功。

相比之下, assertEquals 试图变得聪明,并根据对象类型进行特殊处理。在XML的情况下,它比较XML元素的结构和内容,如果它们具有相同的语义含义,则返回True,尽管它们是不同的对象。