UnitTestについて
上述したようにS2Containerを用いる場合、ある機能を使いたい時はS2Containerからその機能を持つコンポーネントを取り出して使用します。UnitTestについても同様に考えます。S2Containerからある機能をもつコンポーネントを取得してテストします。
ログインサービスのサンプルでは、「login.php」においてS2ContainerからloginServiceコンポーネントを取得しました。この時、S2Containerの自動バインディング機能によりauthLogicコンポーネントと組み合わされた形でloginServiceコンポーネントが返されていました(ConsoleLoginService
にSimplePasswdAuthLogic
がDIされていた)。
ここでは、authLogicコンポーネントのみをコンテナから取得して、認証ロジックのテストをしてみます。UnitTestフレームワークにはPHPUnit2を用います。S2Containerには、PHPUnit2_Framework_TestCase
クラスを継承し、いくつかの機能を追加したS2Container_S2PHPUnit2TestCase
が付属していますのでこれを使用することにします(PHPUnit2を別途インストールする必要があります)。
実際のファイルは次のとおりです。
<?php /** * PHPUnit2 設定 */ require_once('test.inc.php'); /** * S2Container.PHP5 設定 */ require_once('s2setup.inc.php'); /** *SimplePasswdAuthLogic
クラスのUnitTest
クラス */ class SimplePasswdAuthLogicTest extends S2Container_S2PHPUnit2TestCase { /** * S2Containerから自動でauthLogicコンポーネントがセットされます。 * @var AuthLogic */ public $authLogic; /** * @see PHPUnit2_Framework_TestCase::__construct() */ public function __construct($name) { parent::__construct($name); } /** * テスト実行main
メソッド */ public static function main(){ $suite = new PHPUnit2_Framework_TestSuite(__CLASS__); $result = PHPUnit2_TextUI_TestRunner::run($suite); } /** * SimplePasswdAuthLogic::auth() UnitTest */ public function testAuth(){ $this->assertTrue($this->authLogic->auth('foo','bar2006')); $this->assertFalse($this->authLogic->auth('foo','bar')); } /** * 各テストの前処理として、S2Container_S2PHPUnit2TestCase::includeDicon() * にてS2Containerを生成します。 * @see PHPUnit2_Framework_TestCase::setUp() */ protected function setUp(){ print __CLASS__ . "::" . $this->getName() . PHP_EOL; $this->includeDicon('login.dicon'); } /** * @see PHPUnit2_Framework_TestCase::tearDown() */ protected function tearDown() { print PHP_EOL; } } /** * SimplePasswdAuthLogicTest の実行 */ SimplePasswdAuthLogicTest::main(); ?>
<?php /** * PHPUnit2の設定 */ define('PHPUnit2_MAIN_METHOD', ''); require_once('PHPUnit2/Framework/TestSuite.php'); require_once('PHPUnit2/TextUI/TestRunner.php'); ?>
SimplePasswdAuthLogicTest::setUp()
で、S2Container_S2PHPUnit2TestCase::includeDicon()
を実行し、S2Containerを生成しています。
SimplePasswdAuthLogicTest
クラスにアクセス権がpublicなauthLogic
プロパティを用意しておくと、S2Container_S2PHPUnit2TestCase
は、S2Containerからプロパティ名と同名のauthLogicコンポーネントを取得し、authLogic
プロパティにセットしてくれます。
SimplePasswdAuthLogicTest::testAuth()
が実際のテストメソッドになり、ここでauthLogic
プロパティにセットされているauthLogicコンポーネント(SimplePasswdAuthLogic
)をテストします。それでは、SimplePasswdAuthLogicTest
をコマンドラインから実行します。
C:\CodeZine>php SimplePasswdAuthLogicTest.class.php PHPUnit 2.3.5 by Sebastian Bergmann. SimplePasswdAuthLogicTest::testAuth . Time: 0.486456 OK (1 test) C:\CodeZine>
まとめ
ログインサービスの説明の中で、ところどころに「コンテナにDIしてもらう」、「コンテナにインジェクションしてもらう」といった表現が出てきました。S2Containerを用いたDIベースの開発では、S2ContainerによるDIを想定した設計・実装・テストを行います。ログインサービスでもS2ContainerがDIできるように、プロパティにセッターメソッドを用意したり、自動バインディング機能を用いるためにセッターメソッド引数をインターフェイスでType Hintingしています。そして、使いたい機能はS2Containerから取得して使用し、テストしたい場合も同様にS2Containerからコンポーネントを取り出してテストします。
PHP5がリリースされてから2年ほど経ち、PHP4からPHP5に移行する機会が増えつつあると思います。もしPHP5で開発を始められることがありましたら、S2Contaienr.PHP5を導入し、DIベースの開発を始めてみてはいかがでしょうか。
参考資料
- 『Seasar入門 はじめてのDI&AOP』 須賀幸次 著、ソフトバンククリエイティブ、2006年2月
- 『Web+DB press(Vol.31)』 技術評論社、2006年2月
- Seasarファウンデーション
- Maple.PHP
- S2Container.PHP5
- S2Dao.PHP5
- S2Base.PHP5
- labs.s2php5.jp