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