Windows で PHPUnit と vfsStream と phpDocumentor2 を入れる

(2012/09/03 追記) phpDocumentor2 も入れました。


PHPUnit で vfsStream というものを使うと ファイルシステムのモック なんてことが出来るらしいので入れてみました。


最初に このページ の通りにインストールしようとしましたが上手くいきませんでした。「mikey179/vfsStream · GitHub」を見た感じ Composer でインストール出来るようなのでそっちでインストールすることにします。


また、折角なのでついでに PEARPHPUnit と phpDocumentor2 も入れなおしました。

はじめに

まず前提として、私は以下のようなディレクトリ構造で環境変数 PATH の定義によってどちらのバージョンを使うかを切り替えるようにしています。PEAR はバージョンで共通でも(多分)大丈夫なので、1 つだけインストールするようにします*1

D:\app\php-5.3.3
D:\app\php-5.3.16
D:\app\php-pear

go-pear の実行

Windows で pear を使えるようにするためには go-pear というものを実行します。が、その前に次のように環境変数を設定しておきます。

名前
PHP_PEAR_BIN_DIR D:\app\php-pear
PHP_PEAR_SYSCONF_DIR D:\app\php-pear
PHPBIN php
PHP_PEAR_BIN_DIR
phpdoc の実行に必要だったので・・・
PHP_PEAR_SYSCONF_DIR
無いと Windows フォルダに pear.ini が作成されてしまうので・・・
PHPBIN
phpunit で PATH 環境変数PHP のバージョンを切り替えるため・・・


あ、もちろん PATH に D:\app\php-pear の追加も忘れずにやっておきます(じゃないと phpunit とかの実行が不便)。


次に go-pear を実行します。昔は go-pear.bat というバッチファイルが php の Windows バイナリのアーカイブに含まれていた気がするのですが最近は含まれていないようです。なので http://pear.php.net/go-pear.phar からダウンロードします。


ダウンロードしたファイルは D:\app\php-pear に配置して、次の様に実行します。

cd /d D:\app\php-pear
php go-pear.phar


go-pear の 最初のプロンプトはデフォルトのまま Enter します。

Are you installing a system-wide PEAR or a local copy?
(system|local) [system] :


次のプロンプトでインストール場所などが表示されます。↓のような感じになっているはずなのでそのまま Enter します。

 1. Installation base ($prefix)                   : D:\app\php-pear
 2. Temporary directory for processing            : D:\app\php-pear\tmp
 3. Temporary directory for downloads             : D:\app\php-pear\tmp
 4. Binaries directory                            : D:\app\php-pear
 5. PHP code directory ($php_dir)                 : D:\app\php-pear\pear
 6. Documentation directory                       : D:\app\php-pear\docs
 7. Data directory                                : D:\app\php-pear\data
 8. User-modifiable configuration files directory : D:\app\php-pear\cfg
 9. Public Web Files directory                    : D:\app\php-pear\www
10. Tests directory                               : D:\app\php-pear\tests
11. Name of configuration file                    : D:\app\php-pear\pear.ini
12. Path to CLI php.exe                           : D:\app\php-5.3.16


あとは Enter 連打で go-pear を完了させます。最後に次のようなメッセージが表示されて PEAR_ENV.reg の実行が促されます。これは PEAR 用の環境変数を設定するものですが最初に設定した PHP_PEAR_SYSCONF_DIR だけで十分なので無視します。

For convenience, a REG file is available under D:\app\php-pearPEAR_ENV.reg .
This file creates ENV variables for the current user.

pearPHPUnit をインストール

pear をインストールした直後なので、まずは既存パッケージのアップデートを行います。

pear update-channels
pear upgrade-all


PHPUnit をインストールします。

pear config-set auto_discover 1
pear install -a pear.phpunit.de/PHPUnit


もしよくわからない変なエラーが出たら↓のようにキャッシュをクリアしてから再実行すると上手くいきます。

pear clear-cache

pear で phpDocumentor2 をインストール

pear コマンドでインストールします。

pear channel-discover pear.phpdoc.org
pear install phpdoc/phpDocumentor-alpha

Composer で vfsStream をインストール

Composer は 次の場所にインストールすることにします。なお、msysgit が入ってないと上手くいかないです・・・

D:\local\php-lib\composer\


↑このディレクトリに composer.json という名前で次のようにファイルを作成します。

composer.json
{
    "require": {
        "mikey179/vfsStream": ">=1.0.0"
    }
}


↑このディレクトリ内で次の通りコマンドを実行します。

curl -s http://getcomposer.org/installer | php
php composer.phar install


vendor というディレクトリが作成され、その中に色々ダウンロードされます。vfsStream 自体は vendor/mikey179/vfsStream/ に保存されますが、vendor/autoload.php をインクルードするだけで vfsStream は使用できるようになっています。

vfsStream

早速動かしてみましたー!

<?php
require_once 'vendor/autoload.php';

use org\bovigo\vfs\vfsStream;

class vfsStreamTest extends PHPUnit_Framework_TestCase
{
	private $vfsRoot;
	private $vfsPath;
	
	protected function setUp()
	{
		$this->vfsRoot = vfsStream::setup();
		$this->vfsPath = vfsStream::url($this->vfsRoot->getName());
	}
	
	/**
	 * @test
	 */
	public function vfsStream_1()
	{
		$file = vfsStream::newFile("hoge.txt");
		$file->write("hogehoge");
		$this->vfsRoot->addChild($file);
		
		$this->assertFileExists($this->vfsPath . DIRECTORY_SEPARATOR . "hoge.txt");
		
		$this->assertEquals("hogehoge", file_get_contents($this->vfsPath . DIRECTORY_SEPARATOR . "hoge.txt"));
	}
}

*1:pecl でダメな気がしますが Windows で pecl とかまず使いません