phpunit中assertEquals和assertSame之间的区别?

Kev*_*rke 111 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

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

Mik*_*ell 184

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

assertSame

报告由$message两个变量标识的错误,$expected并且$actual没有相同的类型."

正如你可以在上面摘录下面的例子中看到,他们通过'2204'2204,这将使用失败assertSame,因为一个是一个string,另一个是int,基本上是:

'2204' !== 2204
assertSame('2204', 2204) // this test fails
Run Code Online (Sandbox Code Playgroud)

assertEquals

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

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

'2204' == 2204
assertEquals('2204', 2204) // this test passes
Run Code Online (Sandbox Code Playgroud)

我刚刚针对上面的示例运行了一些单元测试,实际上它们导致了记录的行为.

  • assertEquals甚至认为''0012'=='12'.即使两个值都是字符串,它们也会转换为整数进行比较!你应该尽可能地使用assertSame. (14认同)
  • 关于**将对象**与`assertSame()`进行比较的重要说明.如果两个变量$ expected和$ actual不引用同一个对象,则报告$ message标识的错误.https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame (3认同)
  • 不幸的是,即使assertEquals似乎也很挑剔,例如在比较数组属性和抱怨string vs int时. (2认同)
  • 所有这些让我想知道为什么我们不只使用assertTrue与===和==,这样我们就知道在没有谷歌的情况下发生了什么。 (2认同)

Gri*_* P. 19

说到对象比较:

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
Run Code Online (Sandbox Code Playgroud)

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

    $this->assertEquals($expected, $actual); PASSES
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这个答案并不全面(它只涵盖了对象),但这正是我需要知道的.谢谢!:) (6认同)
  • 是的,但是 `assertEquals()` 将 `null` 和 `""` 甚至 `0` 进行比较。 (2认同)
  • 刚刚发现了一个由此引起的隐藏错误(测试了“0.0”而不是“null”)。从现在开始我将完全避免使用`assertEquals`。 (2认同)

bro*_*man 18

$this->assertEquals(3, true);
$this->assertSame(3, true);
Run Code Online (Sandbox Code Playgroud)

第一个将通过!

第二个将失败.

这就是区别.

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

  • 我刚刚在测试驱动开发过程中遇到了这个问题。测试通过,假设返回值 3,但实际上返回 true。有趣的是 $this->assertEquals('3', true); 失败。 (2认同)