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

假设我有一个行动:

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

此操作的简单单元测试将验证视图输出中的文本是什么。 在不使用硒的情况下,它在zend框架中很容易。 我们可以在zend中创建伪造的GET和POST。 但是我还没有在Yii中找到同样的例子。 请建议。


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

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

你需要一个runmode参数(在config / main.php中)来确定你是一个testrun还是一个产品。 在生产中,输出只是回显,而我们无法在testrun中回显任何东西(只会破坏单元测试报告)。 在测试代​​码中,您可以在$ render_output中获得输出,您可以在其中执行断言包装器xpath或strpos检查。 这个破解并不是最好的,但是做得很好。

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;

}
链接地址: http://www.djcxy.com/p/61261.html

上一篇: yii controller action unit testing without selenium

下一篇: FM radio application in android development