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;
}
は今ここにテストすることさえ少ないがあります。このような関数をテストするのは意味があるのですか?
これがMVCなら、あなたのコントローラはちょっと太っていると思います。データベースアクセスがモデル内にある必要がありますか? –
はい、データベースクエリーはモデル内にあるはずです。 – moteutsch
コントローラからすべてのSQLを抽象化するために、クエリ全体をモデルに入れます。 'studentsForMentor($ mentorId)'のような 'MStudent'メソッドを作成します。また、静的メソッドを使用するコードをテストするのは難しい作業です。 –