4

PHP と zend フレームワークを使用して、優れたソフトウェアを迅速に構築する必要があります。私はこれを TDD の方法で進めようとしています。なぜなら、私よりも経験豊富な人々が、コードを管理しやすくしながら迅速にビルドするための最良の方法であると私に言ったからです。

それで、私はphpunitに関する本を手に入れ、うまくいきました.実際、最初の面倒の後、スピードアップし始め、コードはまだいいです. オブジェクトを個別にテストする方法が好きです。

ただし、zend アクション コントローラーのテストには大きな問題が 1 つあります。zend_test パッケージは、それをテストする方法を提供します。しかし、それはアプリケーション全体を一度にテストしているようです。リポジトリをうまくスタブまたはモックしたり、他の依存関係を注入したりすることはできないようです。そのため、プロジェクトの残りの部分でできるほど広範囲にテストすることができませんでした。

私はこの問題を解決するために探してきました。しかし、ネット上で見つけたのは、それを行う zend_test の方法だけでした。

これについてあなたの意見を知りたいです。多分私は物事をやり過ぎようとしているだけなのかもしれませんし、あるいは zend アクション コントローラの単体テストを開発するためのより良い方法があるのか​​もしれません。

4

2 に答える 2

1

Rob Allenは、 PHPUnit を使用した Zend コントローラー アクションのテストに関する非常に優れた記事を書きました。これはZend_Test_PHPUnit_ControllerTestCase、アプリケーション全体をブートストラップし、応答をテストする を使用します。

PHPUnit と一般的な機能テストは、コントローラーのテストには適していません。逆に、コントローラーは単体テストには適していません。つまり、単体テストの概念はコントローラー層の概念とは無意味であり、コントローラーは通常、本質的に単体テストを困難にする方法で構築されています。

私が提案できる最良の代替手段は、Seleniumを使用することです。これにより、コントローラーからの応答がテストされます (ほとんどの場合、実際にビューがテストされます)。Selenium テストに加えて、モデルと残りのライブラリの単体テストも行う必要があります。これは、コントローラー層で実際に取得できる防弾とほぼ同じです。

于 2011-09-22T19:42:56.237 に答える
1

Zend 1 では、コントローラは通常のクラスです。それをインスタンス化し、その上でメソッドを呼び出すことができます (たとえば、デフォルトのリポジトリをリポジトリの PHPUnit モックに置き換えます。

class MyController extends Zend_Controller_Action
{
   public functioni init()
   {
      $this->repository = new MyRepository();
   }

   public function setRepository($repository)
   {
      $this->repository = $repository;
   }

   public function saveAction()
   {
      $dataToWrite = manipulate in some way $this->getRequest()->getParams();
      $this->repository->update($dataToWrite, ...);
   }
}

ただし、リクエストを注入し、ディスパッチしてレスポンスを取得する必要もあります。

個人的には、コントローラーについては、単体テスト (を使用Zend_Test) よりも機能テストを作成することを好みます。それは遅く、メモリ内の sqlite データベースなどが必要になるでしょう。しかし、アプリケーションが本当に機能するかどうかはわかります。すべてのクラスを単体テストできますが、オブジェクトを接続するファクトリが間違っている場合は、壊れたアプリケーションで緑色の PHPUnit バーが引き続き表示されます。

于 2011-09-22T19:31:34.187 に答える