我正在使用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;
}
在那裏測試有什麼感覺嗎?你會如何測試它?
編輯:
因此,從斯蒂芬的反饋,我可以重構,把模型的數據庫訪問:
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抽象出來。在'MStudent'上創建一個方法,比如'studentsForMentor($ mentorId)'。此外,您將很難測試使用靜態方法的代碼。 –