4.7.5 モデルのテスト

4.7.5.1 テストケースの作成

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

すでに app/models/article.php で「Article」モデルが次のように定義されているとします。

 <?php  
   class Article extends AppModel { 
          var $name = 'Article'; 
           
          function published($fields = null) { 
              $conditions = array( 
                  $this->name . '.published' => 1 
              ); 
               
              return $this->findAll($conditions, $fields); 
          } 
   
   } 
 ?> 
  1. <?php
  2. class Article extends AppModel {
  3. var $name = 'Article';
  4. function published($fields = null) {
  5. $conditions = array(
  6. $this->name . '.published' => 1
  7. );
  8. return $this->findAll($conditions, $fields);
  9. }
  10. }
  11. ?>

モデルの機能をテストするために、上述のモデル定義にフィクスチャを用いてテストするように準備を行うとします。CakePHP の統合テストツールは、最小限のファイルだけを読み込みます。これは問題の切り分けを容易にするため、他のモデルの干渉を避けるためです。そのためまず、親のモデル(今回の場合は、定義済みの「Article」モデル)を読み込みます。次にどのデータベースの設定を使用するかを指定します。CakePHP の統合テストツールは、フィクスチャに頼るすべてのモデルで使われる、 test_suite という名前の DB 設定を有効にします。$useDbConfig を設定すると、 CakePHP の統合テストツールが、どのデータベース接続を利用するのかを指定できます。

定義済みのモデルのコードを再利用するために、「Article」クラスを拡張したテストのモデルを作成し、 $useDbConfig と $name を適切に設定します。そのファイルは app/tests/cases/modelsarticle.test.php という名前で保存してください。内容は次のようになります。

 <?php  
   App::import('Model','Article'); 

   
   class ArticleTestCase extends CakeTestCase { 
          var $fixtures = array( 'app.article' ); 
   } 
 ?> 
  1. <?php
  2. App::import('Model','Article');
  3. class ArticleTestCase extends CakeTestCase {
  4. var $fixtures = array( 'app.article' );
  5. }
  6. ?>

「ArticleTestCase」を作成しました。$fixtures 変数では、どのフィクスチャを使うかを定義します。

モデルが別のモデルと関連しているなら、関連しているモデルを使用しない場合でも、全てのモデルのフィクスチャを用意しておく必要があります。例えば、 A hasMany B hasMany C hasMany D といった場合、 ATestCase には a, b, c, d のフィクスチャを含めます。

4.7.5.2 テストのためのメソッドを作成する

「Article」モデルの「published()」関数をテストするためのメソッドを作成してみましょう。app/tests/cases/models/article.test.php を次のように編集してください。

  <?php
    App::import('Model', 'Article');
    
    class ArticleTestCase extends CakeTestCase {
        var $fixtures = array( 'app.article' );
    
        function testPublished() {
            $this->Article =& ClassRegistry::init('Article');
    
            $result = $this->Article->published(array('id', 'title'));
            $expected = array(
                array('Article' => array( 'id' => 1, 'title' => '1番目の記事' )),
                array('Article' => array( 'id' => 2, 'title' => '2番目の記事' )),
                array('Article' => array( 'id' => 3, 'title' => '3番目の記事' ))
            );
    
            $this->assertEqual($result, $expected);
        }
    }
    ?>    
  1. <?php
  2. App::import('Model', 'Article');
  3. class ArticleTestCase extends CakeTestCase {
  4. var $fixtures = array( 'app.article' );
  5. function testPublished() {
  6. $this->Article =& ClassRegistry::init('Article');
  7. $result = $this->Article->published(array('id', 'title'));
  8. $expected = array(
  9. array('Article' => array( 'id' => 1, 'title' => '1番目の記事' )),
  10. array('Article' => array( 'id' => 2, 'title' => '2番目の記事' )),
  11. array('Article' => array( 'id' => 3, 'title' => '3番目の記事' ))
  12. );
  13. $this->assertEqual($result, $expected);
  14. }
  15. }
  16. ?>


testPublished()」という名前のメソッドを追加しました。まずフィクスチャを用いた「Article」モデルのインスタンスを作成し、次にそのインスタンスの「published()」メソッドを実行します。「article」が初期状態で持つレコードをフィクスチャで定義したので、「published()」メソッドが返すべき値はわかります。この値を、 $expected に設定してください。「assertEqual」メソッドを用いて、実際の値と期待した値が一致するかをテストします。テストの実行方法は、「テストの作成」の章を参照してください。