FuelPHPをやってみる (25) - ログ出力をテストする -

2012-12-07T00:00:00+00:00 FuelPHP PHP

FuelPHPにLogクラスがありますけど、これを使う場合のログ出力をテストケースでテストしたい場合どうするのかって所。とりあえず手法として、

ログが出力される前と後でログをdiffする
ファイルポインタで出力前に末尾にカーソルを移しておいて出力後にログ取得メソッドで更新された分のカーソルを取得する

っていう手法を思いついた。とりあえず前者なパターンをやってみた(どっちがいいかと言われたら後者の方が良いんじゃないかと思う所)

検証対象コントローラー (fuel/app/classes/controller/home.php)

<?php

class Controller_Home extends Controller {
    public function get_index() {
        Log::debug("hoge");
        Log::warning("fuga");

        return Response::forge("OK");
    }
}

Logクラスを出力される結果をテストケースで取得する(log_thresholdでwarningとdebugに限定しておく)。とりあえずそれを扱うクラスを作る

fuel/app/classes/test_logger.php

<?php

class Test_Logger {

    private $logs;

    public function __construct() {
        $this->logs = @file($this->getLogFilename()) ?: array(); // 実行前に現状のログを取得しておく
    }

    public function fetchLogs() {
        $logs = @file($this->getLogFilename()) ?: array(); // 実行後にメソッド呼び出したら新しく現状のログを取得する

        $diff_logs = array_diff($logs, $this->logs); // 実行後と前で状態をdiffする

        $this->logs = $logs; // 実行前のログを更新しておく

        return $diff_logs;
    }

    private function getLogFilename() {
        $log_path = Config::get("log_path");

        if (is_null($log_path)) {
            throw new RuntimeException("missing "log_path" configuration");
        }

        return sprintf(
            "%s/%s.php",
            rtrim($log_path, "/"), // 最後にスラッシュがついてるのがキモい
            date("Y/m/d")
        );
    }
}

あとはテストケースで使う

fuel/app/test/controller/home.php

<?php

class Test_Controller_Home extends TestCase {

    private $logger;

    public function setUp() {
        $this->logger = new Test_Logger();
    }

    public function test_get_index() {
        $res = Request::forge("home/index")->execute()->response();
        $this->assertThat($res, $this->logicalNot($this->isNull()));

        Debug::dump($this->logger->fetchLogs());
    }

    public function test_dummy() {
        Log::debug("test");

        Debug::dump($this->logger->fetchLogs());
    }
}

まぁsetUpで初期化して、コントローラー処理を実行後にログをTest_Loggerクラスのメソッドを使って取得する。でoil testすると

PHPUnit 3.7.9

Configuration read from /home/kinjouj/Desktop/fuelphp_sample/fuel/core/phpunit.xml

.array(2) {
    [25] => string(37) "Debug - 2012-12-07 01:12:32 --> hoge\n"
    [26] => string(39) "Warning - 2012-12-07 01:12:32 --> fuga\n"
}
.array(1) {
    [27] => string(37) "Debug - 2012-12-07 01:12:32 --> test\n"
}

Time: 0 seconds, Memory: 2.75Mb

な感じで取得できる

gradle使ってみる (1) FuelPHPをやってみる (24) - Goutteでコントローラーテスト -