PHPUnit の @backupStaticAttributes はどう使うのか?
PHPUnit テストケースで書き換えた値を復帰する - Shin x blog を参考にちょっと検証してみました。
まず、以下のようなテストクラスのアノテーションで「@backupStaticAttributes enabled」を指定した、テストを作成します。
<?php class Singleton { private static $_self = null; public $count = 0; private function __construct() { } public static function getInstance() { if (is_null(self::$_self)) { self::$_self = new static(); } return self::$_self; } } /* * @backupStaticAttributes enabled */ class SingletonTest extends PHPUnit_Framework_TestCase { //protected $backupStaticAttributes = true; /** * test_singleton1 */ public function test_singleton1() { Singleton::getInstance()->count = 1; $this->assertEquals(1, Singleton::getInstance()->count); } /** * test_singleton2 */ public function test_singleton2() { $this->assertEquals(0, Singleton::getInstance()->count); } }
テストを実行します。
$ phpunit --colors SingletonTest singleton.php PHPUnit 3.6.10 by Sebastian Bergmann. .F Time: 1 second, Memory: 3.25Mb There was 1 failure: 1) SingletonTest::test_singleton2 Failed asserting that 1 matches expected 0. /home/kenji/tmp/singleton.php:38 /opt/lampp-1.7.7/bin/phpunit:46 FAILURES! Tests: 2, Assertions: 2, Failures: 1.
失敗します。静的プロパティの保存や復元がされていないということになります。
それでは、テストメソッドのアノテーションに「@backupStaticAttributes enabled」を指定してみます。
<?php class Singleton { private static $_self = null; public $count = 0; private function __construct() { } public static function getInstance() { if (is_null(self::$_self)) { self::$_self = new static(); } return self::$_self; } } class SingletonTest extends PHPUnit_Framework_TestCase { //protected $backupStaticAttributes = true; /** * test_singleton1 * @backupStaticAttributes enabled */ public function test_singleton1() { Singleton::getInstance()->count = 1; $this->assertEquals(1, Singleton::getInstance()->count); } /** * test_singleton2 */ public function test_singleton2() { $this->assertEquals(0, Singleton::getInstance()->count); } }
テストを実行します。
PHPUnit 3.6.10 by Sebastian Bergmann. .. Time: 0 seconds, Memory: 3.00Mb OK (2 tests, 2 assertions)
パスします。これは有効のようです。
と、このシンプルな例ではこのように動作していますが、どうも実際のアプリで動かすと、なんかうまく意図したように動作してくれません...