2011-08-05 9 views
0

PHPUnitを使用してMVCアプリケーションをテストしています。私のモデル(この例ではSite、MStudent、MMenu)のコードの大半は単体テストでカバーされていますが、私のコントローラ上の関数をテストするのは難しいです。私のフレームワークの典型的なコントローラ機能は次のようになります:この典型的なコントローラメソッドをどのようにテストしますか?

/** 
* List the mentor's students 
*/ 
public function students() 
{ 
    // set some variables needed in the view 
    $menu = MMenu::init($this->mentor, "List of students"); 
    $filter = ""; 
    $students = array(); 

    $sql = "SELECT * " 
      . "FROM {Site::app()->settings['tablePrefix']}students s " 
      . "WHERE s.pID = {$this->mentor->id} " 
      . "ORDER BY s.lastvisit DESC"; 

    $cmd = Site::app()->db()->prepare($sql); 
    if ($cmd->execute() AND ($rows = $cmd->fetchAll(PDO::FETCH_ASSOC))) 
    { 
     foreach ($rows as $row) 
     { 
      $students[] = new MStudent($row); 
     } 
    } 

    // call the view 
    include Site::app()->viewPath("manage/students"); 
    exit; 
} 

そこにテストするには意味がありますか?どのようにそれをテストしますか?

EDIT:
だから、ステファンフィードバックから、私はモデルでデータベースへのアクセスをリファクタリングして置くことができます:

public function students() 
{ 
    // set some variables needed in the view 
    $menu = MMenu::init($this->mentor, "List of students"); 
    $filter = ""; 

    $students = MStudent::studentsFromQuery("SELECT * FROM students WHERE pID=" . $this->mentor->id); 

    // call the view 
    include Site::app()->viewPath("manage/students"); 
    exit; 
} 

は今ここにテストすることさえ少ないがあります。このような関数をテストするのは意味があるのですか?

+0

これがMVCなら、あなたのコントローラはちょっと太っていると思います。データベースアクセスがモデル内にある必要がありますか? –

+0

はい、データベースクエリーはモデル内にあるはずです。 – moteutsch

+0

コントローラからすべてのSQLを抽象化するために、クエリ全体をモデルに入れます。 'studentsForMentor($ mentorId)'のような 'MStudent'メソッドを作成します。また、静的メソッドを使用するコードをテストするのは難しい作業です。 –

答えて

1

コントローラロジックをモデルに移動しても、コントローラテストでテストする必要はありません。あなたがモデルに入るものは何でも嘲笑されなければならない。

実際にユニットをテストして価値あるものにすることができるコントローラはほとんどありません(IMO)。すべての依存関係を嘲笑するコスト/メリットは払い戻されません。多くの場合、コントローラメソッドはシステムテストの一部として間接的にテストされます。

+0

SOコミュニティの誰もいないように見えるので、より良い答えが得られます。あなたの有益な答えをありがとう。それはかなり長い間私を悩ましている何かを明確にします。 –

関連する問題