您将如何测试这种典型的控制器方法?

时间:2011-08-05 12:33:56

标签: php unit-testing model-view-controller phpunit

我正在使用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;
}

在那里测试是否有可行的事情?你会如何测试它?

修改
因此,根据Stephen的反馈,我可以重构并将数据库访问权限放在模型中:

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;
}

现在在这里测试更少。测试这些功能是否有意义?如何做到这一点?

1 个答案:

答案 0 :(得分:1)

应该注意的是,将控制器逻辑移动到模型中并不排除在控制器测试中测试它的必要性!无论你进入模型,都必须嘲笑。

很少有控制器能够做到这么少,以至于它实际上可以以一种值得(IMO)的方式进行单元测试。模拟所有依赖项的成本/收益并没有带来回报。通常,控制器方法会间接作为系统测试的一部分进行测试。