PHP のファイルの読み書きをユニットテストする方法を探していたところ vfsStream
という仮想のファイルシステムを提供してくれるツールを見つけました。
例えば下記のようなファイルの内容を1行ずつ読み取って配列に格納するメソッド read
をもった Hoge
クラスをテストの対象とします。
Hoge.php
<?php
class Hoge{
public function read($filename){
$fh = fopen($filename, 'r');
$terms = array();
while($term = fgets($fh, 1024)){
$terms[] = $term;
}
return $terms;
}
}
そして下記は Hoge
クラスの read
メソッドを、vfsStream を使ってテストする PHPUnit のテストコードです。なお、vfsStream は composer でインストールしています。
HogeTest.php
<?php
require 'Hoge.php';
require 'vendor/autoload.php';
use org\bovigo\vfs\vfsStream;
class HogeTest extends PHPUnit_Framework_TestCase{
public function testRead(){
/**
* 仮想のファイルを生成する。
*/
vfsStream::setup();
$path = vfsStream::url('root/sample.txt');
$fh = fopen($path, 'w');
fwrite($fh, '東京' . PHP_EOL . '埼玉' . PHP_EOL . '大阪' . PHP_EOL);
fclose($fh);
/**
* 仮想のファイルを使って Hoge クラスの
* read メソッドが正しく動作するか確かめる。
*/
$hoge = new Hoge();
$this->assertEquals(
array('東京' . PHP_EOL, '埼玉' . PHP_EOL, '大阪' . PHP_EOL),
$hoge->read($path)
);
}
}
仮想のファイルを作り、任意のテキストを書き込んでおき、それを想定通りに読み込めるかをテストすることができました。書き込みをテストしたい場合はこの手順を逆にして、最初に仮想ファイルに対して書き込みのメソッドを実行して、その仮想ファイルの中身を検証すれば書き込みのテストもできますね。