Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

assertEqualsじゃなくてassertSameを使う

最近填ったのが次のようなテスト。

<?php
require_once 'PHPUnit/Framework.php';
class ATest extends PHPUnit_Framework_TestCase
{
    public function testExecute()
    {
        $obj = $this->getMock('AnObject', array('execute'));
        $obj->expects($this->any())
            ->method('execute')
            ->will($this->returnValue('1'));
        $this->assertEquals('00000001', $obj->execute());
    }
}

AnObjectオブジェクトのexecuteメソッドを叩くと文字列の"1"が返されるのですが、実行するとテストにパスしてしまいます。

$ phpunit tests/ATest.php
PHPUnit 3.3.17 by Sebastian Bergmann.

.

Time: 0 seconds

OK (1 test, 2 assertions)
$

これは、

$ php -r 'var_dump("1" == "00000001");'
bool(true)
$

ということをやってるのと同じです。
じゃあ、"=="じゃなくて"==="でテストしたい場合は、assertSameを使います。"==="と同様、型も一致しているかどうかもassertの対象となります。assertSameのAPIドキュメントは、PHPUnit – The PHP Testing Frameworkをどうぞ。

<?phppublic function testExecute()
    {$this->assertSame('00000001', $obj->execute());
    }
$ phpunit tests/ATest.php
PHPUnit 3.3.17 by Sebastian Bergmann.

F

Time: 0 seconds

There was 1 failure:

1) testExecute(ATest)
expected string <00000001>
difference      <x???????>
got string      <1>
/path/to/tests/ATest.php:11

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
$ 

その他、assertNotSameやassertAttributeSame、assertAttributeNotSameの各メソッドもあります。
「テストはパスするのになんだかおかしい」というときは、チェックしてみると良いかも知れません。

ちなみに、PHP4でも動作するPHPUnit1.3.2でもassertSameが用意されていますが、PHP5.0.0以降でないと動作しないようです。