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;
}
지금 여기에 테스트 할 더 적은이있다. 이와 같은 함수를 테스트하는 것은 이치에 맞습니까?
이것이 MVC라면 컨트롤러가 약간 뚱뚱하다고 생각합니다. 물론 데이터베이스 액세스가 모델에 있어야합니까? –
예, 데이터베이스 쿼리가 모델에 있어야합니다. – moteutsch
컨트롤러에서 모든 SQL을 추상화하기 위해 전체 쿼리를 모델에 넣었습니다. 'studentsForMentor ($ mentorId)'와 같은'MStudent' 메소드를 만듭니다. 또한 정적 메서드를 사용하는 코드를 테스트하는 데 어려움을 겪을 것입니다. –