<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.test.phpunit" xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Zend_Test_PHPUnit(日本語)</title>

    <para>
        <classname>Zend_Test_PHPUnit</classname> は
        <acronym>MVC</acronym> アプリケーション向けのテストケースを用意します。
        さまざまな責務に対応したテスト用のアサーションが含まれています。
        実際に何ができるのかを知るには、
        サンプルを見ていただくのが一番でしょう。
    </para>

    <example id="zend.test.phpunit.loginexample">
        <title>Application Login TestCase のサンプル</title>

        <para>
            以下に示すのは
            <classname>UserController</classname>
            用のシンプルなテストケースで、以下のような内容を検証します。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                ログインフォームは、未認証のユーザに対しても表示されること。
                </para>
            </listitem>

            <listitem>
                <para>
                ユーザがログインしたら、自分のプロファイルページにリダイレクトされること。
                そしてプロファイルページには、関連する情報が表示されること。
                </para>
            </listitem>
        </itemizedlist>

        <para>
            この例は、いくつかの前提条件のもとに作成されています。
            まず、起動時の設定のほとんどをプラグインに追い出しました。
            これにより、環境設定が簡潔になったのおで
            テストケースの準備がしやすくなりました。
            また、アプリケーションの起動処理が 1 行で書けるようになっています。
            また、autoloading の設定を行うことで、
            (コントローラやプラグインなどの)
            適切なクラスをいちいち require することを考えなくてすむようにしています。
        </para>

        <programlisting language="php"><![CDATA[
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }

    public function appBootstrap()
    {
        $this->frontController
             ->registerPlugin(new Bugapp_Plugin_Initialize('development'));
    }

    public function testCallWithoutActionShouldPullFromIndexAction()
    {
        $this->dispatch('/user');
        $this->assertController('user');
        $this->assertAction('index');
    }

    public function testIndexActionShouldContainLoginForm()
    {
        $this->dispatch('/user');
        $this->assertAction('index');
        $this->assertQueryCount('form#loginForm', 1);
    }

    public function testValidLoginShouldGoToProfilePage()
    {
        $this->request->setMethod('POST')
              ->setPost(array(
                  'username' => 'foobar',
                  'password' => 'foobar'
              ));
        $this->dispatch('/user/login');
        $this->assertRedirectTo('/user/view');

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

        $this->request->setMethod('GET')
             ->setPost(array());
        $this->dispatch('/user/view');
        $this->assertRoute('default');
        $this->assertModule('default');
        $this->assertController('user');
        $this->assertAction('view');
        $this->assertNotRedirect();
        $this->assertQuery('dl');
        $this->assertQueryContentContains('h2', 'User: foobar');
    }
}
]]></programlisting>

        <para>
            この例は、もう少しシンプルに書くこともできます。
            ここで示したアサーションのすべてが必須というわけではなく、
            単に説明のためだけに用意しているものもあるからです。
            アプリケーションのテストがいかにシンプルにできるのか、
            この例でご理解いただけることでしょう。
        </para>
    </example>

    <xi:include href="Zend_Test-PHPUnit-Bootstrapping.xml" />
    <xi:include href="Zend_Test-PHPUnit-Testing.xml" />
    <xi:include href="Zend_Test-PHPUnit-Assertions.xml" />
    <xi:include href="Zend_Test-PHPUnit-Examples.xml" />
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
