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をどうぞ。
<?php : public 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以降でないと動作しないようです。