DI、PHPUnit、およびセットアップ

依存性注入は、開発者の作業を楽にする非常に優れた機能です。 しかし、ここにそのようなデザイナーが登場する理由でもあります。



public function __construct( \Psr\Log\LoggerInterface $logger, \Zend_Db_Adapter_Pdo_Abstract $dba, ISomeService $service, ... ) { $this->_logger = $logger; $this->_dba = $dba; $this->_service = $service; ... }
      
      





ユニットテストでsetUp()



を使用すると、開発中のクラスのさまざまな実装機能をテストするために同じモックセットを数回作成する必要がある場合に、作業が楽になります。



上記のコンストラクタを持つクラスがあるとしましょう。 別のテスト方法で環境を濡らすには、次のようなものを書く必要があります。



  /* create mocks */ $mLogger = $this->getMockBuilder(\Psr\Log\LoggerInterface::class)->getMock(); $mDba = $this->getMockBuilder(\Zend_Db_Adapter_Pdo_Abstract::class)->getMockForAbstractClass(); $mService = $this->getMockBuilder(\Vendor\Module\ISomeService::class)->disableOriginalConstructor()->getMock(); ... /* setup mocks behaviour */ ... /* */ $obj = new Demo($mLogger, $mDba, $mService, ...); $res = $obj->method($arg1, ...); $this->assert...
      
      





オブジェクトの依存関係の数が十分に多く、実装する機能がかなり複雑な場合、単体テストには、モックオブジェクトの初期化を伴うかなりの量のブロックを含めることができ、その動作はチェックされた要件に従って特殊化されます。 そして、コンストラクターの依存関係の数が変更された場合、各テストメソッドに新しいモックオブジェクトを追加し、 $obj = new Demo(...);



ごとにやり直す必要があり$obj = new Demo(...);







DRY( Do n't Repeat Yourself )の原則に従って、1つの場所でモックを作成することに焦点を合わせ、対応するテスト方法のテスト条件に応じてモックの動作を特化する必要があります。 これは、 setUp



関数を使用して実行できます。 最初に、テスト対象のオブジェクトとPHPUnitの依存関係モックのプロパティを作成します。



 private $mLogger; private $mDba; private $mService; private $obj
      
      





次に、各テストメソッドの前に呼び出されるsetUp



関数で、モックとオブジェクトを再初期化します。



 private function setUp() { $this->mLogger = $this->getMockBuilder(\Psr\Log\LoggerInterface::class)->getMock(); $this->mDba = $this->getMockBuilder(\Zend_Db_Adapter_Pdo_Abstract::class)->getMockForAbstractClass(); $this->mService = $this->getMockBuilder(\Vendor\Module\ISomeService::class)->disableOriginalConstructor()->getMock(); ... $this->obj = new Demo($this->mLogger, $this->mDba, $this->mService, ...); }
      
      





その後、対応するテスト関数で必要なモック動作を専門化します。



 public function test_method() { /* setup mocks behaviour */ $this->mLogger->expects... ... $res = $this->obj->method(); }
      
      





チップのFesorに特に感謝しますsetUp()



を使用する松葉杖よりもsetUp()



を使用した方がよいことを示します。




All Articles