假设我有一个动作:
function actionShowItem($id)
{
$item = Item::model()->findByPk($id);
$this->render("showitem",array('model' => $id));
}
此操作的简单单元测试是什么,它将验证视图输出中的文本。它在zend框架中很容易,不使用硒。我们可以在zend中创建假的GET和POST。但我在Yii中没有找到相同的例子。请建议。
答案 0 :(得分:4)
Yii PHP框架在许多方面都非常出色,但它内部不支持任何类型的模拟控制器动作输出测试非常令人遗憾。它只有基于selenium的Web浏览器方法。我从ZendF来到Yii,zend确实有很好的测试系统,包括基于xpath的断言。所以我必须理解代码流并在我的components / Controller.php中编写代码。它可以在不改变任何核心yii框架的情况下完成,在我看来,这是Yii的魅力。
每个客户端代码都有components / Controller.php,它是Yii中所有控制器的通用基类。而render是一个CController方法,这意味着我可以覆盖它并捕获视图输出以供单元测试代码使用。
你需要一个运行模式参数(在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;
}