phpunit中assertEquals和assertSame之间的区别?

时间:2012-04-20 22:04:21

标签: phpunit

PHPUnit包含一个assertEquals方法:https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals

它还有一个assertSame方法:https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame

乍一看,看起来他们做同样的事情。两者有什么区别?他们为什么都指定了?

7 个答案:

答案 0 :(得分:167)

我偶尔使用这些,但根据文档:

assertSame

  

如果两个变量$message$expected不具有相同的类型,则报告$actual标识的错误。“

正如您在上面的示例中看到的那样摘录,它们正在传递'2204'2204,这将使用assertSame失败,因为其中一个是string并且一个基本上是int,

'2204' !== 2204
assertSame('2204', 2204) // this test fails

assertEquals

  

“如果两个变量$ expected和$ actual不相等,则报告$ message标识的错误。”

assertEquals似乎没有考虑数据类型,所以使用上面的2204示例:

'2204' == 2204
assertEquals('2204', 2204) // this test passes

我刚刚对上面的示例进行了一些单元测试,实际上它们导致了记录在案的行为。

答案 1 :(得分:16)

$this->assertEquals(3, true);
$this->assertSame(3, true);

第一个将通过!

第二个将失败。

这就是区别。

我认为你应该总是使用assertSame。

答案 2 :(得分:16)

说到对象比较:

assertSame:只能断言2个对象是否引用同一个对象实例。因此,即使两个单独的对象的所有属性具有完全相同的值,如果assertSame不引用同一个实例,它们也会失败。

    $expected = new \stdClass();
    $expected->foo = 'foo';
    $expected->bar = 'bar';

    $actual = new \stdClass();
    $actual->foo = 'foo';
    $actual->bar = 'bar';

    $this->assertSame($expected, $actual); FAILS

assertEquals:在任何情况下都可以断言2个独立的对象是否与其属性值匹配。所以它是适合断言对象匹配的方法。

    $this->assertEquals($expected, $actual); PASSES

https://phpunit.de/manual/current/en/appendixes.assertions.html

答案 3 :(得分:3)

如前所述,AssertSame报告错误,如果这两个元素不共享类型,但它是'同样重要的是要注意docummentation

  

如果两个变量$ expected,则报告$ message标识的错误   和$ actual不引用同一个对象。

所以即使他们分享类型和价值,这个测试也会失败:

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}

答案 4 :(得分:1)

此外,

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");

答案 5 :(得分:0)

assertSame()==测试实际输出和预期参数是否相同。

即:

$this->assertSame('$expected','$expected');

$this->assertSame('100','100');

assertEquals ==如果我们看到一个网站页面,我有一个有2个'表'的页面,所以当我运行assertEquals时,我将通过使用count函数检查它的计数'table'是2。 例如:

$this->assertEquals(2, $var->filter('table')->count()); 

在这里我们可以看到assertEquals检查在网页上找到了2个表。我们还可以使用括号内的“#division name”在页面上找到分区。

例如2:

public function testAdd()
{
    $calc = new Calculator();

    $result = $calc->add(30, 12);

    // assert that our calculator added the numbers correctly!
    $this->assertEquals(42, $result);
}

答案 6 :(得分:0)

如前所述,assertEquals()主要是关于解释的值,可以是类型juggling,也可以是带有__magic表示方法的对象(例如__toString())。

assertSame()的一个好用例是测试单件工厂。

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}