<commit_before><?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 17175 -->
<sect2 id="zend.test.phpunit.testing">
    <title>コントローラおよび MVC アプリケーションのテスト</title>

    <para>
        起動用の設定を済ませたら、テストの開始です。
        テストの方法は PHPUnit テストスイートによるものとほぼ同じですが、
        ちょっとした違いがいくつかあります。
    </para>

    <para>
        まず、テストケースの <methodname>dispatch()</methodname>
        メソッドを用いてテストの <acronym>URL</acronym> をディスパッチしなければなりません。
    </para>

    <programlisting language="php"><![CDATA[
class IndexControllerTest extends Zend_Test_PHPUnit_Controller_TestCase
{
    // ...

    public function testHomePage()
    {
        $this->dispatch('/');
        // ...
    }
}
]]></programlisting>

    <para>
        しかし、時にはこれ以外の情報 (GET 変数や POST 変数、
        COOKIE 情報など) が必要になることもあります。
        これらの情報をリクエストに含めることもできます。
    </para>

    <programlisting language="php"><![CDATA[
class FooControllerTest extends Zend_Test_PHPUnit_Controller_TestCase
{
    // ...

    public function testBarActionShouldReceiveAllParameters()
    {
        // GET 変数を設定します
        $this->request->setQuery(array(
            'foo' => 'bar',
            'bar' => 'baz',
        ));

        // POST 変数を設定します
        $this->request->setPost(array(
            'baz'  => 'bat',
            'lame' => 'bogus',
        ));

        // クッキーの値を指定します
        $this->request->setCookie('user', 'matthew');
        // あるいは複数の値を指定します
        $this->request->setCookies(array(
            'timestamp' => time(),
            'host'      => 'foobar',
        ));

        // ヘッダを設定することもできます
        $this->request->setHeader('X-Requested-With', 'XmlHttpRequest');

        // リクエストメソッドを設定します
        $this->request->setMethod('POST');

        // ディスパッチします
        $this->dispatch('/foo/bar');

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

    <para>
        リクエストが準備できたので、次はアサーションを作成してみましょう。
    </para>
</sect2>
<!--
vim:se ts=4 sw=4 et:
--><commit_msg>sync Japanese document with r18221, r18222, r18223, and r18225.<commit_after><?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 18225 -->
<sect2 id="zend.test.phpunit.testing">
    <title>コントローラおよび MVC アプリケーションのテスト</title>

    <para>
        起動用の設定を済ませたら、テストの開始です。
        テストの方法は PHPUnit テストスイートによるものとほぼ同じですが、
        ちょっとした違いがいくつかあります。
    </para>

    <para>
        まず、テストケースの <methodname>dispatch()</methodname>
        メソッドを用いてテストの <acronym>URL</acronym> をディスパッチしなければなりません。
    </para>

    <programlisting language="php"><![CDATA[
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    // ...

    public function testHomePage()
    {
        $this->dispatch('/');
        // ...
    }
}
]]></programlisting>

    <para>
        しかし、時にはこれ以外の情報 (GET 変数や POST 変数、
        COOKIE 情報など) が必要になることもあります。
        これらの情報をリクエストに含めることもできます。
    </para>

    <programlisting language="php"><![CDATA[
class FooControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    // ...

    public function testBarActionShouldReceiveAllParameters()
    {
        // GET 変数を設定します
        $this->request->setQuery(array(
            'foo' => 'bar',
            'bar' => 'baz',
        ));

        // POST 変数を設定します
        $this->request->setPost(array(
            'baz'  => 'bat',
            'lame' => 'bogus',
        ));

        // クッキーの値を指定します
        $this->request->setCookie('user', 'matthew');
        // あるいは複数の値を指定します
        $this->request->setCookies(array(
            'timestamp' => time(),
            'host'      => 'foobar',
        ));

        // ヘッダを設定することもできます
        $this->request->setHeader('X-Requested-With', 'XmlHttpRequest');

        // リクエストメソッドを設定します
        $this->request->setMethod('POST');

        // ディスパッチします
        $this->dispatch('/foo/bar');

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

    <para>
        リクエストが準備できたので、次はアサーションを作成してみましょう。
    </para>

    <sect3 id="zend.test.phpunit.testing.redirector">
        <title>コントローラのテストと Redirector アクションヘルパー</title>

        <important>
            <para>
                Redirect アクションヘルパーは、<methodname>gotoAndExit()</methodname>
                メソッドを使うときに <code>exit()</code>
                ステートメントを発行し、このメソッドのテストを停止させます。
                アプリケーションのテスト容易性を考慮して、
                リダイレクタではこのメソッドを使わないようにしましょう。
            </para>
        </important>

        <para>
            その性質上、リダイレクタアクションヘルパープラグインは
            リダイレクトしたあと処理を終了します。exit をコールする部分をテストすることはできないので、
            <classname>Zend_Test_PHPUnit_ControllerTestCase</classname>
            は自動的にリダイレクタでの exit 部分を無効化します。
            その結果、テスト時と実際の実行時で挙動が変わってくることがありえます。
            リダイレクトが正しく動作することを確実にするには、次のようにします。
        </para>

        <programlisting language="php"><![CDATA[
class MyController extends Zend_Controller_Action
{
    public function indexAction()
    {
        if($someCondition == true) {
            return $this->_redirect(...);
        } else if($anotherCondition == true) {
            $this->_redirector->gotoSimple("foo");
            return;
        }

        // do some stuff here
    }
}
]]>
        </programlisting>

        <important>
            <para>
                アプリケーションによっては、これだけでは不十分かもしれません。さらに
                <code>preDispatch()</code> あるいは
                <code>postDispatch()</code> といったロジックを実行するかもしれないからです。
                現状の Zend Test では、これらをうまく処理することはできません。
            </para>
        </important>
    </sect3>
</sect2>
<!--
vim:se ts=4 sw=4 et:
-->
{'fraction_non_alphanumeric': 0.1425939572586588, 'fraction_numerical': 0.00847457627118644, 'mean_word_length': 2.0689655172413794, 'pattern_counts': {'":': 0, '<': 82, '<?xml version=': 2, '>': 125, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5012238', 'n_tokens_mistral': 2426, 'n_tokens_neox': 2187, 'n_words': 264}