<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect2 id="zend.test.phpunit.bootstrapping">
    <title>テストケースの起動</title>

    <para>
        <link linkend="zend.test.phpunit.loginexample">Login
        サンプル</link> で説明したように、すべての <acronym>MVC</acronym>
        テストケースは
        <classname>Zend_Test_PHPUnit_ControllerTestCase</classname>
        を継承しなければなりません。このクラスは
        <classname>PHPUnit_Framework_TestCase</classname> を継承しており、
        PHPUnit が提供する仕組みやアサーションをすべて使用できます。
        またそれに加えて、Zend Framework の
        <acronym>MVC</acronym> 実装に特化した scaffold 機能やアサーションもあります。
    </para>

    <para>
        <acronym>MVC</acronym> アプリケーションをテストするには、まずそれを起動する必要があります。
        いくつかの方法がありますが、どの方法になるかは public プロパティ
        <code>$bootstrap</code> で決まります。
    </para>

    <para>
        最初に、そして、おそらく最も直接的には、
        単純に <filename>index.php</filename> で行うように
        <classname>Zend_Application</classname> インスタンスを作成します。
        そして、それを <varname>$bootstrap</varname> プロパティにアサインします。
        一般的に、これは <methodname>setUp()</methodname> で行います。
        実行されるときに、 <methodname>parent::setUp()</methodname> を呼ぶ必要があります。
    </para>

    <programlisting language="php"><![CDATA[
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        //１段階でアサインしてインスタンス化します。
        $this->bootstrap = new Zend_Application(
            'testing',
            APPLICATION_PATH . '/configs/application.ini'
        );
        parent::setUp();
    }
}
]]></programlisting>

    <para>
        次に、このプロパティでファイルを指定できます。
        そうすると、そのファイルはフロントコントローラをディスパッチせず、
        単にフロントコントローラ (とアプリケーション固有の設定)
        を準備するだけの役割となります。
    </para>

    <programlisting language="php"><![CDATA[
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $bootstrap = '/path/to/bootstrap/file.php'

    // ...
}
]]></programlisting>

    <para>
        ３番目の方法として、アプリケーションを起動するための
        <acronym>PHP</acronym> コールバックを指定できます。
        この方法は <link
            linkend="zend.test.phpunit.loginexample">Login サンプル</link>
        で使用しています。使用するコールバックが関数や static
        メソッドである場合は、クラスレベルで設定できます。
    </para>

    <programlisting language="php"><![CDATA[
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $bootstrap = array('App', 'bootstrap');

    // ...
}
]]></programlisting>

    <para>
        オブジェクトのインスタンスが必要な場合は、
        <methodname>setUp()</methodname> メソッドを利用することを推奨します。
    </para>

    <programlisting language="php"><![CDATA[
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        // Bootstrap オブジェクトのインスタンスメソッド 'start' を使用します
        $bootstrap = new Bootstrap('test');
        $this->bootstrap = array($bootstrap, 'start');
        parent::setUp();
    }
}
]]></programlisting>

    <para>
        <methodname>parent::setUp()</methodname>; に注目しましょう。
        これは必須です。とうのも、<classname>Zend_Test_PHPUnit_ControllerTestCase</classname>
        の <methodname>setUp()</methodname> メソッドが残りの起動処理
        (コールバックの呼び出しも含む) を実行するからです。
    </para>

    <para>
        通常、<methodname>setUp()</methodname> メソッドは次のようにアプリケーションを起動します。
        まずクリーンな環境を読み込んでリクエストの状態を初期化し、
        プラグインやヘルパーをすべてリセットし、
        フロントコントローラをリセットして
        リクエストオブジェクトとレスポンスオブジェクトを新しく作成します。
        それが終わったら、<varname>$bootstrap</varname>
        で指定したファイルを <methodname>include()</methodname> するか、
        あるいは指定したコールバックを呼び出します。
    </para>

    <para>
        テストの起動処理は、可能な限りそのアプリケーションの起動処理と同じになるようにしています。
        しかし、いくつかの制約もあります。
    </para>

    <itemizedlist>
        <listitem><para>
            リクエストオブジェクトやレスポンスオブジェクトに独自実装を用意しても、
            それが使われることはありません。
            <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> は、
            独自のリクエストオブジェクトとレスポンスオブジェクト (それぞれ
            <classname>Zend_Controller_Request_HttpTestCase</classname> および
            <classname>Zend_Controller_Response_HttpTestCase</classname>)
            を持っています。これらのオブジェクトには、
            指定した方法でリクエスト環境を準備したり
            指定した方法で人工的なレスポンスを返したりするメソッドが用意されています。
        </para></listitem>

        <listitem><para>
            テストサーバに特定の設定を期待してはいけません。
            言い換えると、テストの実行環境が特定のサーバ設定になっていることは保証されていないということです。
            アプリケーション側から期待してもかまわないのは、
            単にルータがリクエストをルーティングしてくれるということだけです。
            サーバ固有のヘッダをリクエストオブジェクトに含めてはいけません。
        </para></listitem>
    </itemizedlist>

    <para>
        アプリケーションが起動したら、
        いよいよテストを作り始めることができます。
    </para>
</sect2>
<!--
vim:se ts=4 sw=4 et:
-->
