Zend_Test-PHPUnit-Testing.xml 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 19418 -->
  4. <sect2 id="zend.test.phpunit.testing">
  5. <title>コントローラおよび MVC アプリケーションのテスト</title>
  6. <para>
  7. 起動用の設定を済ませたら、テストの開始です。
  8. テストの方法は PHPUnit テストスイートによるものとほぼ同じですが、
  9. ちょっとした違いがいくつかあります。
  10. </para>
  11. <para>
  12. まず、テストケースの <methodname>dispatch()</methodname>
  13. メソッドを用いてテストの <acronym>URL</acronym> をディスパッチしなければなりません。
  14. </para>
  15. <programlisting language="php"><![CDATA[
  16. class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  17. {
  18. // ...
  19. public function testHomePage()
  20. {
  21. $this->dispatch('/');
  22. // ...
  23. }
  24. }
  25. ]]></programlisting>
  26. <para>
  27. しかし、時にはこれ以外の情報 (GET 変数や POST 変数、
  28. COOKIE 情報など) が必要になることもあります。
  29. これらの情報をリクエストに含めることもできます。
  30. </para>
  31. <programlisting language="php"><![CDATA[
  32. class FooControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  33. {
  34. // ...
  35. public function testBarActionShouldReceiveAllParameters()
  36. {
  37. // GET 変数を設定します
  38. $this->request->setQuery(array(
  39. 'foo' => 'bar',
  40. 'bar' => 'baz',
  41. ));
  42. // POST 変数を設定します
  43. $this->request->setPost(array(
  44. 'baz' => 'bat',
  45. 'lame' => 'bogus',
  46. ));
  47. // クッキーの値を指定します
  48. $this->request->setCookie('user', 'matthew');
  49. // あるいは複数の値を指定します
  50. $this->request->setCookies(array(
  51. 'timestamp' => time(),
  52. 'host' => 'foobar',
  53. ));
  54. // ヘッダを設定することもできます
  55. $this->request->setHeader('X-Requested-With', 'XmlHttpRequest');
  56. // リクエストメソッドを設定します
  57. $this->request->setMethod('POST');
  58. // ディスパッチします
  59. $this->dispatch('/foo/bar');
  60. // ...
  61. }
  62. }
  63. ]]></programlisting>
  64. <para>
  65. リクエストが準備できたので、次はアサーションを作成してみましょう。
  66. </para>
  67. <sect3 id="zend.test.phpunit.testing.redirector">
  68. <title>コントローラのテストと Redirector アクションヘルパー</title>
  69. <important>
  70. <para>
  71. Redirect アクションヘルパーは、<methodname>gotoAndExit()</methodname>
  72. メソッドを使うときに <methodname>exit()</methodname>
  73. ステートメントを発行し、このメソッドのテストを停止させます。
  74. アプリケーションのテスト容易性を考慮して、
  75. リダイレクタではこのメソッドを使わないようにしましょう。
  76. </para>
  77. </important>
  78. <para>
  79. その性質上、リダイレクタアクションヘルパープラグインは
  80. リダイレクトしたあと処理を終了します。exit をコールする部分をテストすることはできないので、
  81. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname>
  82. は自動的にリダイレクタでの exit 部分を無効化します。
  83. その結果、テスト時と実際の実行時で挙動が変わってくることがありえます。
  84. リダイレクトが正しく動作することを確実にするには、次のようにします。
  85. </para>
  86. <programlisting language="php"><![CDATA[
  87. class MyController extends Zend_Controller_Action
  88. {
  89. public function indexAction()
  90. {
  91. if($someCondition == true) {
  92. return $this->_redirect(...);
  93. } else if($anotherCondition == true) {
  94. $this->_redirector->gotoSimple("foo");
  95. return;
  96. }
  97. // do some stuff here
  98. }
  99. }
  100. ]]></programlisting>
  101. <important>
  102. <para>
  103. アプリケーションによっては、これだけでは不十分かもしれません。さらに
  104. <methodname>preDispatch()</methodname> あるいは
  105. <methodname>postDispatch()</methodname> といったロジックを実行するかもしれないからです。
  106. 現状の Zend Test では、これらをうまく処理することはできません。
  107. </para>
  108. </important>
  109. </sect3>
  110. </sect2>
  111. <!--
  112. vim:se ts=4 sw=4 et:
  113. -->