Unit testing 不含硒的yii控制器动作单元测试

Unit testing 不含硒的yii控制器动作单元测试,unit-testing,yii,phpunit,Unit Testing,Yii,Phpunit,假设我有一个动作: function actionShowItem($id) { $item = Item::model()->findByPk($id); $this->render("showitem",array('model' => $id)); } 此操作的简单单元测试是什么,它将验证视图输出中的文本。它在zend框架中很容易实现,无需使用selenium。我们可以在zend中创建假的GET和POST。但我在Yii中没有找到相同的例子。请建议 Yii

假设我有一个动作:

function actionShowItem($id)
{
    $item = Item::model()->findByPk($id);
    $this->render("showitem",array('model' => $id));
}

此操作的简单单元测试是什么,它将验证视图输出中的文本。它在zend框架中很容易实现,无需使用selenium。我们可以在zend中创建假的GET和POST。但我在Yii中没有找到相同的例子。请建议

Yii-PHP框架在许多方面都非常好,但它内部不支持任何类型的模拟控制器动作输出测试,这让人非常遗憾。它只有基于selenium的web浏览器方法。我是从ZendF来到Yii的,zend有很好的测试系统,包括基于xpath的断言。因此,我必须理解代码流,并在我的components/Controller.php中编写代码。这可以在不改变任何核心yii框架的情况下完成,我认为这就是yii的魅力所在

每个客户端代码都有components/Controller.php,这是Yii中所有控制器的公共基类。render是一个CController方法,这意味着我可以覆盖它并捕获视图输出,以供单元测试代码使用

您需要一个runmode参数(在config/main.php中)来标识您是测试运行还是生产运行。在生产环境中,输出只是回显,而我们不能回显testrun中的任何内容(只会破坏单元测试报告)。在测试代码中,您可以在$render_output中获得输出,您可以对其执行断言包装器xpath或strps检查。这个黑客不是最好的,但是做得很好

function render($view,$data=null,$return=false)
{
    $out = parent::render($view,$data,true);

    if(isset(Yii::app()->params['runmode']) 
       && Yii::app()->params['runmode'] == 'test')
    {
        global $render_output;
        return $render_output = $out;
    }

    if($return)
        return $out;
    else
        echo $out;

}