无硒YII控制器操作的单元测试(yii controller action unit testing

2019-09-19 02:53发布

假设我有一个动作:

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

什么是这个动作,这将验证在视图中输出文本的简单的单元测试。 它很容易在Zend Framework中不使用硒。 我们可以在Zend公司制造假GET和POST太。 但是我还没有发现在Yii中同样的例子。 请建议。

Answer 1:

在Yii的PHP框架是在很多方面非常好,但它非常可悲的是它不支持内部任何形式的模拟控制器动作输出测试。 它只有基于硒的Web浏览器的方法。 我从ZendF来的Yii和Zend确实有良好的测试系统,包括基于XPath断言。 所以,我必须了解我的部件/ Controller.php这样内部的代码流和码本。 它可以在不改变任何核心Yii框架这在我看来是Yii的魅力来完成。

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

您将需要一个runmode参数(在配置/ 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;

}


文章来源: yii controller action unit testing without selenium