PHPUnit中assertEquals和assertSame之间的差异?

PHPUnit中assertEquals和assertSame之间的差异?,phpunit,Phpunit,PHPUnit包含一个方法,但它也有一个方法。乍一看,他们似乎做了同样的事情 这两者的区别是什么?为什么两者都指定了?我偶尔都会使用,但根据文档: 如果两个变量$expected和$actual的类型和值不相同,则报告由$message识别的错误 正如您在上面摘录的下面的示例中所看到的,它们正在传递'2204'和2204,使用assertSame将失败,因为一个是字符串,一个是整数,基本上: '2204' !== 2204 assertSame('2204', 2204) // this tes

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


这两者的区别是什么?为什么两者都指定了?

我偶尔都会使用,但根据文档:

如果两个变量
$expected
$actual
的类型和值不相同,则报告由
$message
识别的错误

正如您在上面摘录的下面的示例中所看到的,它们正在传递
'2204'
2204
,使用
assertSame
将失败,因为一个是
字符串,一个是
整数,
基本上:

'2204' !== 2204
assertSame('2204', 2204) // this test fails
“如果$expected和$actual两个变量不相等,则报告由$message标识的错误。”

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

'2204' == 2204
assertEquals('2204', 2204) // this test passes
我刚刚对上面的例子进行了一些单元测试,它们确实产生了记录在案的行为

$this->assertEquals(3, true);
$this->assertSame(3, true);
第一个会通过

第二个将失败

这就是区别

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

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

即:

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

assertEquals==如果我们看到一个网站页面,我有一个页面有2个“table”,因此当我运行assertEquals时,我将使用count函数检查其计数,确保“table”为2。 例如:

在这里,我们可以看到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);
}
而且

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

在对象比较方面:

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

$expected=new\stdClass();
$expected->foo='foo';
$expected->bar='bar';
$actual=new\stdClass();
$actual->foo='foo';
$actual->bar='bar';
$this->assertSame($expected,$actual);//失败
资产质量 在任何情况下,如果两个单独的对象匹配其属性值,则可以断言。因此,该方法适合断言对象匹配

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

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

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

因此,即使它们共享类型和值,该测试也会失败:

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

如前所述,
assertEquals()
主要是关于一个解释的值,可以是通过类型杂耍,也可以是一个具有“魔术”表示方法的对象(
\uuuuuu toString()

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

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

assertEquals甚至认为
'0012'=='12'
。即使这两个值都是字符串,它们也会转换为整数进行比较!您应该尽可能地使用assertSame。不幸的是,即使是assertEquals似乎也很挑剔,例如,在比较数组属性时,会抱怨字符串与int的关系。遵循marco fiset的建议t、 注意:自PHPUnit 4.0以来,这种行为已不再存在,请参阅有关将对象与
assertSame()进行比较的重要说明
。如果$expected和$actual两个变量未引用同一对象,则报告由$message标识的错误。所有这一切使我想知道为什么我们不使用assertTrue with==和==以便我们知道在没有google的情况下会发生什么。请使用代码格式使代码部分更清晰,并避免使用
标记unless您想创建一个标题。我刚刚在测试驱动开发期间遇到了这个问题。测试通过,假设返回了值3,但实际返回了true。有趣的是,$this->assertEquals('3',true);失败。虽然这个答案并不全面(它只涉及对象),这正是我需要知道的。谢谢!:)是的,但是
assertEquals()
比较
null
,甚至
0
都是相等的。刚刚发现了一个隐藏的错误,它是由这个错误引起的(测试的是
0.0
而不是
null
)。从现在起,我将完全避免
assertEquals
class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}
class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}