152

PHPUnit 包含一个assertEquals()方法,但它也有assertSame()一个。乍一看,他们似乎在做同样的事情。

两者有什么区别?为什么它们都被指定?

4

7 回答 7

234

我偶尔使用两者,但根据文档:

assertSame

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

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

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

assertEquals

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

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

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

我只是针对上述示例运行了一些单元测试,实际上它们导致了记录在案的行为。

于 2012-04-20T22:12:29.127 回答
42

当涉及到对象比较时:

断言相同

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

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

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

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

断言等于

可以断言两个单独的对象是否在任何情况下都匹配它们的属性值。所以它是适合断言对象匹配的方法。

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

参考

于 2016-06-06T09:14:36.327 回答
21
$this->assertEquals(3, true);
$this->assertSame(3, true);

第一个会过去的!

第二个会失败。

这就是区别。

我认为您应该始终使用 assertSame。

于 2013-01-26T10:44:50.047 回答
3

如前所述,AssertSame如果两个元素不共享类型值,则会报告错误,但从文档中注意这一点也很重要:

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

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

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}
于 2016-11-23T13:26:14.337 回答
1

而且,

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");
于 2015-02-13T15:04:57.643 回答
0

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

那是 :

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

或者

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

assertEquals == 如果我们看到一个网站页面,我有一个有 2 个“表”的页面,所以当我运行 assertEquals 时,我将使用计数函数检查它的计数,即“表”为 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);
}
于 2013-08-14T12:03:46.457 回答
0

如前所述,assertEquals()主要是关于一个解释值,无论是类型杂耍还是具有 __magic 表示方法的对象(__toString()例如)。

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

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
于 2018-04-24T10:23:50.130 回答