20120327 phpstudy58-phake
TRANSCRIPT
Phakeで簡単 モックオブジェクト作成
Katsuhiro OGAWA @fivestr2012.03.27 - PHP勉強会@東京 #58
About Me小川 雄大 - OGAWA Katsuhiro @fivestr
株式会社クロコス
会社では高橋って呼ばれてます
パーフェクトPHP書きました
5月にもPHPの本出すみたいです (色々未定)
OOP、MVC、DDD
2
Agenda
スタブとモック
Phakeとは
Phake API
Phakeのインストール
3
テストが遅い?DBやIO、Web APIなどへのアクセスを伴う処理のテストってどうしてますか?
DBアクセスしてたらテストが遅くなったりするし、Web APIだとネットワークにつながってないとテストできないですよね
そんなときはスタブの出番です
4
スタブとは前述のような外部の何かへのアクセスの代わりに定数を返すようにしたものがスタブ
stub out - もみ消す
従来: return $webservice->api($id);
スタブ: return [‘id’ => ‘1’, ‘name’ => ‘takahashi’];
定数に置き換える
5
サンプルFacebookクラスはFacebookが提供するPHP SDK。api()メソッドでAPIへアクセス
ClientクラスはFacebookオブジェクトを使ってデータアクセス
6
スタブで差し替えFacebookクラスのapi()メソッドを上書きして定数を返すようにすれば、Web APIへのアクセスをなくせる
上位モジュール
下位モジュール
7
スタブの活用スタブを使うと、DBやWeb APIといった、外部の何かへの依存を切り離すことが可能
外部の何かへのアクセスができない状態でも、アクセス処理をスタブに置き換えることで上位モジュールのテストが可能
8
モックオブジェクトとはモックオブジェクトはスタブの一種
スタブが何らかの動作の代用品でしかないのに対して、モックオブジェクトは上位モジュールが下位モジュールを正しく使用しているかをテストするためのもの
9
モックオブジェクトの活用DBに保存するような戻り値を伴わないメソッドをスタブ化したいときは、戻り値が何であるかではなく、メソッド自体が呼び出されていることを確認する
10
モックオブジェクトの作り方単なるスタブと違って、モックオブジェクトはメソッドが呼び出されたことをテストしなければならない
モックオブジェクトフレームワークを使ってモックオブジェクトを作成するのが一般的
代表的なものがPHPUnit標準のPHPUnit_MockObject
今回紹介するPhakeもフレームワークの1つ
11
Phake直感的に使えるモックオブジェクトフレームワーク
JavaのMockitoがベース
PHPUnitにも対応
12
PHPUnit_MockObject
13
;
Phake
14
;
PhakePhake::mock
モックオブジェクトの作成
Phake::when
スタブメソッドの作成
Phake::verify
メソッドが正しく呼び出されたか
15
Phake::mockPhake::mock( $classname [, $arg1[, $... ]] )
指定したクラス名を元にモックオブジェクトを作成
第2引数以降がコンストラクタの引数
16
Phake::whenPhake::when( $mock ) ->スタブ化したいメソッド(期待する引数) ->呼び出されたらどうなるか()
スタブ化したいメソッドと引数をそのまま記述
Phake::when($mock)->foo(Phake::anyParameters())
foo()メソッドが引数問わず呼び出される
17
Phake::when - AnswersthenReturn( $value )
$value を返す
thenThrow( $exception )
$exception をスロー
thenCallParent()
parent呼び出し
18
Phake::verifyPhake::verify( $mock [, $mode ] ) ->検証するメソッド(期待する引数)
Phake::verify($mock, Phake::times($n))->foo()
foo()メソッドが$n回呼び出されたことを検証
Phake::verifyNoIntaraction($mock)
$mockオブジェクトのスタブメソッドが何も呼び出されなかったことを検証
19
Partial Mocks通常 Phake::mock() でモックオブジェクトを作成すると、すべてのメソッドがスタブ化される
一部のメソッドのみスタブ化したい場合はパーシャルモックとして作成する
パーシャルモックオブジェクトは基本的にはメソッドがそのまま呼び出されるが、Phake::when()で部分的にスタブメソッドに置き換えることが可能
20
21
22
Partial Mocksパーシャルモックが必要になるようであれば、部分的設計を見直すいい機会かも
パーシャルモックでスタブ化した部分を別のクラスとして抽出して、モックオブジェクトで置き換える方がたぶん素直でわかりやすいと思います
23
Installationpear config-set auto_discover 1pear install pear.digitalsandwich.com/phake
include_pathを設定してPhake.phpを読み込むだけ
24
まとめPhakeを使うと直感的にモックオブジェクトを作れる
思考の流れに沿ってスムーズにモックオブジェクトが作れるためテストが捗る
PHPUnitのMockObjectで十分なら無理に使わなくていいんじゃないですかね……
25
Linkshttp://phake.digitalsandwich.com/
https://github.com/mlively/Phake
http://fivestar.hatenablog.com/
ご清聴ありがとうございました
26