2011-08-05 76 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; 
} 

在那裏測試有什麼感覺嗎?你會如何測試它?

編輯:
因此,從斯蒂芬的反饋,我可以重構,把模型的數據庫訪問:

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抽象出來。在'MStudent'上創建一個方法,比如'studentsForMentor($ mentorId)'。此外,您將很難測試使用靜態方法的代碼。 –

回答

1

應該注意的是,將控制器邏輯移入模型並不排除需要在控制器測試中對其進行測試!無論你進入模型將不得不被嘲笑。

很少有一個控制器可以做到這一點,它實際上可以通過一種非常有價值的方式進行單元測試(IMO)。嘲笑所有依賴關係的成本/收益並沒有得到回報。通常控制器方法是作爲系統測試的一部分間接測試的。

+0

看起來像SO社區沒有人有更好的答案,所以我接受你的方式去。感謝您的幫助。它澄清了一段時間以來一直困擾我的東西。 –

相關問題