PHPUnit 包含一个assertEquals()
方法,但它也有assertSame()
一个。乍一看,他们似乎在做同样的事情。
两者有什么区别?为什么它们都被指定?
我偶尔使用两者,但根据文档:
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
我只是针对上述示例运行了一些单元测试,实际上它们导致了记录在案的行为。
当涉及到对象比较时:
只能断言两个对象是否引用同一个对象实例。因此,即使两个单独的对象的所有属性都具有完全相同的值,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
$this->assertEquals(3, true);
$this->assertSame(3, true);
第一个会过去的!
第二个会失败。
这就是区别。
我认为您应该始终使用 assertSame。
如前所述,AssertSame
如果两个元素不共享类型和值,则会报告错误,但从文档中注意这一点也很重要:
如果两个变量 $expected 和 $actual 没有引用同一个对象,则报告由 $message 标识的错误。
所以即使它们共享类型和值,这个测试也会失败:
class SameTest extends TestCase
{
public function testFailure()
{
$this->assertSame(new stdClass, new stdClass);
}
}
而且,
// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");
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);
}
如前所述,assertEquals()
主要是关于一个解释值,无论是类型杂耍还是具有 __magic 表示方法的对象(__toString()
例如)。
一个很好的用例assertSame()
是测试单例工厂。
class CacheFactoryTest extends TestCase
{
public function testThatCacheFactoryReturnsSingletons()
{
$this->assertSame(CacheFactory::create(), CacheFactory::create());
}
}