4.7.8 コンポーネントのテスト

「Transporter」モデルを利用し、他のコントローラに機能を提供する「TransporterComponent」コンポーネントが存在するとします。その場合、次の四つのファイルを使います。

  • app/controllers/components/transporter.php の 「Transporter」コンポーネント。
  • app/models/transporter.php の「Transporter」モデル。
  • app/tests/fixtures/transporter_fixture.php の「TransporterTestFixture」フィクスチャ。
  • app/tests/cases/transporter.test.php のテスト用コード。

4.7.8.1 コンポーネントの初期化

CakePHP では、コンポーネントからモデルを直接操作できないようになっているため(参照:/ja/view/62/components)、モデルのデータにアクセスするためのコントローラが必要です。

コンポーネントの startup() 関数を次のようにします。

public function startup(&$controller){ 
          $this->Transporter = $controller->Transporter;  
 }
  1. public function startup(&$controller){
  2. $this->Transporter = $controller->Transporter;
  3. }

次に、ごく簡単な仮のクラスを作成します。

class FakeTransporterController {} 
  1. class FakeTransporterController {}

そしてその中に次のように値を設定していきます。

$this->TransporterComponentTest = new TransporterComponent(); 
$controller = new FakeTransporterController(); 
$controller->Transporter = new TransporterTest(); 
$this->TransporterComponentTest->startup(&$controller); 
  1. $this->TransporterComponentTest = new TransporterComponent();
  2. $controller = new FakeTransporterController();
  3. $controller->Transporter = new TransporterTest();
  4. $this->TransporterComponentTest->startup(&$controller);

4.7.8.2 テスト用のメソッドの作成

CakeTestCase を拡張したクラスを作成し、テストを書いていきましょう。

class TransporterTestCase extends CakeTestCase {
    var $fixtures = array('transporter');  
    function testGetTransporter() { 
          $this->TransporterComponentTest = new TransporterComponent(); 
          $controller = new FakeTransporterController(); 
          $controller->Transporter = new TransporterTest(); 
          $this->TransporterComponentTest->startup(&$controller); 
   
          $result = $this->TransporterComponentTest->getTransporter("12345", "Sweden", "54321", "Sweden"); 
          $this->assertEqual($result, 1, "SP is best for 1xxxx-5xxxx"); 
           
          $result = $this->TransporterComponentTest->getTransporter("41234", "Sweden", "44321", "Sweden"); 
          $this->assertEqual($result, 2, "WSTS is best for 41xxx-44xxx"); 
   
          $result = $this->TransporterComponentTest->getTransporter("41001", "Sweden", "41870", "Sweden"); 
          $this->assertEqual($result, 3, "GL is best for 410xx-419xx"); 
   
          $result = $this->TransporterComponentTest->getTransporter("12345", "Sweden", "54321", "Norway"); 
          $this->assertEqual($result, 0, "Noone can service Norway");         
   }
}
 
  1. class TransporterTestCase extends CakeTestCase {
  2. var $fixtures = array('transporter');
  3. function testGetTransporter() {
  4. $this->TransporterComponentTest = new TransporterComponent();
  5. $controller = new FakeTransporterController();
  6. $controller->Transporter = new TransporterTest();
  7. $this->TransporterComponentTest->startup(&$controller);
  8. $result = $this->TransporterComponentTest->getTransporter("12345", "Sweden", "54321", "Sweden");
  9. $this->assertEqual($result, 1, "SP is best for 1xxxx-5xxxx");
  10. $result = $this->TransporterComponentTest->getTransporter("41234", "Sweden", "44321", "Sweden");
  11. $this->assertEqual($result, 2, "WSTS is best for 41xxx-44xxx");
  12. $result = $this->TransporterComponentTest->getTransporter("41001", "Sweden", "41870", "Sweden");
  13. $this->assertEqual($result, 3, "GL is best for 410xx-419xx");
  14. $result = $this->TransporterComponentTest->getTransporter("12345", "Sweden", "54321", "Norway");
  15. $this->assertEqual($result, 0, "Noone can service Norway");
  16. }
  17. }