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));
}
}
参考
- Mocking the file system using PHPUnit and vfsStream – VG Tech
- vfsStream を使った様々なテストのサンプルがあります。
- Home · mikey179/vfsStream Wiki
- 作成元の GitHub ページ。
- 第10章 テストダブル
- PHPUnit のドキュメント内にある解説。