2

Zend Framework 1.8+ アプリケーションでモデルのテストを開始するにはどうすればよいですか?

テストを開始するためにアプリケーションをセットアップしたとしましょう。私はすでにコントローラーをテストしているので、それが機能することはわかっています。ControllerTestCase.phpファイルを拡張するすべてのコントローラーがあります。

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $application;

    public function setUp()
    {
        $this->application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );

        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }

    public function appBootstrap()
    {
        $this->application->bootstrap();
    }

    public function tearDown()
    {
        Zend_Controller_Front::getInstance()->resetInstance();

        $this->resetRequest();
        $this->resetResponse();

        $this->request->setPost(array());
        $this->request->setQuery(array());
        parent::tearDown();
    }
}

しかし今、私は自分のモデルのテストを開始したいと考えています。私のModelTestCase.php拡張Zend_Test_PHPUnit_ControllerTestCaseではなくZend_Test_PHPUnit_ModelTestCaseのようですが、私が知っているそのようなクラスは存在しません。Zend Framework モデルのテストを開始するにはどうすればよいですか?

4

1 に答える 1

7

ControllerTestCaseコントローラーをテストするための環境のセットアップと破棄には複雑な手順が必要なため、ベースが用意されています。入力はモック HTTP リクエストであり、出力はレンダリングされた HTML であり、期待されるコンテンツを見つけるためにスクレイピングする必要があります。

モデルは、単純な古い PHP オブジェクトに似ています。設定する環境が少なくなります。インターフェイスは、オブジェクトへの単なるメソッド呼び出しです。

したがって、 TestCasePHPUnit の plain を拡張するクラスを開始し、Model クラスの各メソッドに対してTestCase少なくとも 1 つのtestメソッドを (空の functionとして) 追加することから始めます。最終的に Model クラスの各メソッドに対して多くのテスト メソッドが作成されますが、空のテスト メソッドを作成することは、Model メソッドのいくつかを忘れないようにするための良い方法です。

Model は Table ではないことに注意してください。Model は通常、 1 つ以上の Table オブジェクトを使用します。このパターンに従うことで、テーブルのモック オブジェクトを作成できるため、データベースへのライブ接続を必要とせずにテスト スイートを実行できます。

これは、データベースからのデータ セットではなく、合成データ セットを返すようにハードコードされたモック テーブル オブジェクトを設定する例です。

<?php

class MyModelTest extends PHPUnit_Framework_TestCase
{
  protected $_model;

  public function setUp()
  {
    $foo = $this->getMock('FooTable', array('find'));
    $foo->expects($this->any())
        ->method('find')
        ->will($this->returnValue(array("id"=>"123")));

    $this->_model = new MyModel();
    $this->_model->setFooTable($foo);
  }

  public function testCountElements()
  {
    $this->_model->get(123);
    $n = $this->_model->countElements();
    $this->assertEquals(1, $n);
  }

  public function testAsArray()
  {
    $this->_model->get(123);
    $a = $this->_model->asArray();
    $this->assertType('array', $a);
  }

  public function testAddElement()
  {
    // ...etc.
  }

  public function testGetElement()
  {
    // ...etc.
  }

}
于 2010-01-08T19:24:49.950 に答える