PHPUnitでMockeryを使う場合の最低限のメモ。
##Mockeryとはなんぞや?
Mockを作るためのツール。要は、存在しないClassを代替してテストを進めるためのツールと思ってよい。
下記のようなコードがある場合、どうぜんHogeClassが存在することが前提となる。
が、大きなプロジェクト等で「まだHogeClassが無い!」などという場合でもある程度テストを進めておける。
//インスタンス生成
$m = new Hoge('foo');
//メソッドを実行
$m->Hello('foo');
//assertの中で使う
$this->assertEquals("Hello foo",$m->Hello('foo'));
でもどうやって?。以下、それを説明する。
##インストール
別にPHPUnitが必須なわけではないが、基本Mockeryはテストで使うのでテストコードでサンプルを作るためにPHPUnitも入れる。
mkdir test
cd test
composer require --dev phpunit/phpunit
composer require --dev mockery/mockery
--devをつけると通常のcomposer installではインストールされない。composer install --devとする。
##テストを書く
testフォルダを作成して、その中にsampleTest.phpってのを作る(別に名前はなんでも良い)。
mkdir tests
cd tests
vi sampleTest.php
コードは下記のような感じ。
要は、代替するClassのメソッドや引数などを定義し、操作が同じメソッドやreturnを作る。
<?php
require_once 'vendor/autoload.php';
class sampleTest extends PHPUnit_Framework_TestCase
{
public function testSample1()
{
//Mockを設定
$m = \Mockery::mock('Hoge');
$m->shouldReceive('Hello')
->with('foo')
->andReturn("Hello foo");
//Helloメソッドを実行
$m->Hello('foo');
$this->assertEquals("Hello foo",$m->Hello('foo'));
}
}
##テストの実行
テストを普通に実行する。
cd test
vendor/bin/phpunit --colors tests/*
昔はtests/で実行出来たと思うのですが。変わったのかな?
##少し解説
冒頭のコード。本来であればHoge Classが必要。
//インスタンス生成
$m = new Hoge('foo');
//目セッドを実行
$m->Hello('foo');
//assertの中で使う
$this->assertEquals("Hello foo",$m->Hello('foo'));
そのクラスとは、例えば、
<?php
class Hoge
{
public function Hello($name)
{
echo "Hello " . $name;
}
}
というような感じとなる。この程度なら最初に実装してしまえばいいが、もっと複雑な機能をもち、かつ、他チームが開発しているような場合はテストを完成まで進めることができない。が、Mockeryを使えばある程度先に書ける。が、もちろんHoge Classの仕様はある程度決まっている必要があります。