6

假设我有一个动作:

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

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

4

1 回答 1

3

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

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

您需要一个运行模式参数(在 config/main.php 中)来确定您是测试运行还是生产。在生产中,输出只是简单地回显,而我们无法在 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;

}
于 2012-08-13T10:00:20.157 回答