2011-08-05 2 views
0

PHPUnit을 사용하여 MVC 응용 프로그램을 테스트하고 있습니다. 내 모델 (사이트, 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을 추상화하기 위해 전체 쿼리를 모델에 넣었습니다. 'studentsForMentor ($ mentorId)'와 같은'MStudent' 메소드를 만듭니다. 또한 정적 메서드를 사용하는 코드를 테스트하는 데 어려움을 겪을 것입니다. –

답변

1

컨트롤러 로직을 모델로 이동해도 컨트롤러 테스트에서 테스트 할 필요가 없습니다. 어떤 모델로 옮겨 가든지 조롱을 당해야합니다.

컨트롤러가 거의 없기 때문에 실제로 단위 테스트를 수행 할 수 있습니다 (IMO). 모든 종속성을 조롱하는 데 드는 비용/편익만으로 갚을 수는 없습니다. 종종 컨트롤러 메소드는 시스템 테스트의 일부로 간접적으로 테스트됩니다.

+0

SO 커뮤니티에서 아무도 좋아 보이지 않는 것처럼 보입니다. 그래서 나는 당신의 것을 받아들이는 방법으로 받아들입니다. 도움이되는 답변에 감사드립니다. 그것은 꽤 오랫동안 나를 괴롭 히고있는 것을 분명히합니다. –

관련 문제