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 に答える