2

Yii 已经构建了日志系统。在某些情况下,我想确保日志记录正确完成,即正确的消息被记录为“错误”或“警告”。如何从 phpunit 测试用例中读取这些消息?

示例代码:

public function actionDownload($id)
{
    $order = self::$dic->get('StoreOrder')->findByPk($id);
    $logged = Yii::app()->user->getState('usermodel');
    if(!isset($order->id_user))
    {
        Yii::log("could not get user id from order $id","error");
        return false;
    }
    if(!isset($logged->id_user))
    {
        Yii::log("could not get user id from from session","error");
        return false;
    }
    # other code...
}

我需要检查Yii::log在特定测试条件下是否触发了正确。

4

2 回答 2

2

您可能需要创建一个新的自定义CLogRoute(我们称之为CTestLogRoute),它执行类似于将日志消息推送到内部数组的操作。然后添加一些方法来检索推送到内部数组(我们称之为getLastLogEntry())的最后一条日志消息,您可以在assert()语句中使用它。

您可以像这样将特殊的日志路由添加到您的单元测试config文件中:

'components'=>array(
  'log'=>array(
    'class'=>'CLogRouter', 
    'routes'=>array(
       array(
         'class'=>'CTestLogRoute', // custom log router which will save the messages
         'levels'=>'info, error, warning', // select the level you want piped in here
       ),
    ),
 ),

然后在您的单元测试中,您可以执行以下操作:

foreach (Yii::app()->log->routes as $route)
  if ($route instanceof CTestLogRoute) // find our log route
    $lastLogValue = $route->getLastLogEntry(); // get the last entry
$this->assertEquals('Expected last log value',$lastLogValue);

我还没有尝试过,但它应该工作得很好。我喜欢甚至测试错误日志条目的野心!

于 2013-03-25T03:58:13.083 回答
0

有一篇 wiki 文章准确描述了您在此处必须执行的操作:

http://www.yiiframework.com/wiki/340/access-log-output-from-unit-tests

于 2013-03-25T11:37:59.723 回答