vfsStream の使い方

PHPUnit でファイルシステムのテストを行うとき便利な vfsStream ですが、簡単なサンプルがあまり無かったので書いてみました。

vfsStream とは?

  • ファイルの読み書きをテストする時に使うフレームワーク。
  • 仮想ファイルシステムを作成し、その中でディレクトリやファイルを操作できる。
    • 実ファイルシステム: file://…
    • 仮想ファイルシステム: vfs://…
  • 実ファイルを作成せずにテストできるので、テストファイルが散らばる可能性が無く、前回のテストのゴミを意識せずに済む。
  • ディレクトリやファイルの権限/ユーザー/オーナーも再現可能。

インストール方法

詳しくは以前書いた vfsStreamをインストールする | 1000g を参照。

PHP < 5.3 の場合

$ pear channel-discover pear.bovigo.org
$ pear install bovigo/vfsStream-beta

PHP >= 5.3 の場合

composer.json に以下のように書く。

"mikey179/vfsStream": "v1.1.0"

利用可能なバージョンは mikey179/vfsStream - Packagist を参照。

サンプルコード

単純にファイルにテキストを追記するだけのロガーをテストしてみます。

なお、vfsStream 0.12 を利用しています。

Logger.php

Class Logger {
  public static function log($str, $path) {
    return file_put_contents($path, $str);
  }
}

LoggerTest.php

require_once 'Logger.php';
require_once 'vfsStream/vfsStream.php';

class LoggerTest extends PHPUnit_Framework_Test {
    /**
     * @var vfsStreamDirectory
     */
    private $root;

    protected function setUp() {
        // 仮想ファイルシステムにルートディレクトリを作る。
        $this->root = vfsStream::setup();     // "vfs://root" ディレクトリが作成される

        // ファイルのパスは vfsStream::url() で取得する。
        var_dump(vfsStream::url('root'));         // => vfs://root
        var_dump(is_dir(vfsStream::url('root'))); // => true
    }

    /**
     * @covers Logger::log
     */
    public function testLog() {
        $str = 'Lorem ipsum';
        $path = vfsStream::url('root/foo.txt');

        $this->assertGreaterThan(0, Logger::log($str, $path));
        $this->assertEquals($str, file_get_contents($path));
    }
}

参考