Phakeで簡単
モックオブジェクト作成
   Katsuhiro OGAWA @fivestr
   2012.03.27 - PHP勉強会@東京 #58
2

About Me
小川 雄大 - OGAWA Katsuhiro @fivestr

株式会社クロコス

  会社では高橋って呼ばれてます

パーフェクトPHP書きました

5月にもPHPの本出すみたいです (色々未定)

  OOP、MVC、DDD
3
       Agenda

スタブとモック

Phakeとは

Phake API
Phakeのインストール
4

テストが遅い?
DBやIO、Web APIなどへのアクセスを伴う処理のテス
トってどうしてますか?

DBアクセスしてたらテストが遅くなったりするし、Web
APIだとネットワークにつながってないとテストできない
ですよね

そんなときはスタブの出番です
5

スタブとは
前述のような外部の何かへのアクセスの代わりに定数を
返すようにしたものがスタブ

 stub out - もみ消す

従来:  return $webservice->api($id);

スタブ: return [‘id’ => ‘1’, ‘name’ => ‘takahashi’];

 定数に置き換える
6
サンプル
Facebookクラスは
Facebookが提供する
PHP SDK。
api()メソッドでAPIへ
アクセス

Clientクラスは
Facebookオブジェク
トを使ってデータアク
セス
7
スタブで差し替え
Facebookクラスの
api()メソッドを上書き
して定数を返すように
すれば、Web APIへの
アクセスをなくせる

上位モジュール

下位モジュール
8

スタブの活用
スタブを使うと、DBやWeb APIといった、外部の何かへ
の依存を切り離すことが可能

外部の何かへのアクセスができない状態でも、アクセス
処理をスタブに置き換えることで上位モジュールのテス
トが可能
9

モックオブジェクトとは
モックオブジェクトはスタブの一種

スタブが何らかの動作の代用品でしかないのに対して、
モックオブジェクトは上位モジュールが下位モジュール
を正しく使用しているかをテストするためのもの
10

モックオブジェクトの活用
DBに保存するような戻り値を伴わないメソッドをスタブ
化したいときは、戻り値が何であるかではなく、メソッ
ド自体が呼び出されていることを確認する
11

モックオブジェクトの作り方
単なるスタブと違って、モックオブジェクトはメソッド
が呼び出されたことをテストしなければならない

モックオブジェクトフレームワークを使ってモックオブ
ジェクトを作成するのが一般的

代表的なものがPHPUnit標準のPHPUnit_MockObject

今回紹介するPhakeもフレームワークの1つ
12

Phake
直感的に使えるモックオブジェクトフレームワーク

JavaのMockitoがベース

PHPUnitにも対応
13




;




    PHPUnit_MockObject
14




;




    Phake
15

Phake
Phake::mock

  モックオブジェクトの作成

Phake::when
  スタブメソッドの作成

Phake::verify
  メソッドが正しく呼び出されたか
16

Phake::mock
 Phake::mock( $classname [, $arg1[, $... ]] )

 指定したクラス名を元にモックオブジェクトを作成

 第2引数以降がコンストラクタの引数
17

Phake::when
 Phake::when( $mock )
  ->スタブ化したいメソッド(期待する引数)
  ->呼び出されたらどうなるか()

 スタブ化したいメソッドと引数をそのまま記述

 Phake::when($mock)->foo(Phake::anyParameters())
  foo()メソッドが引数問わず呼び出される
18

Phake::when - Answers
 thenReturn( $value )

   $value を返す

 thenThrow( $exception )
   $exception をスロー

 thenCallParent()
   parent呼び出し
19

Phake::verify
 Phake::verify( $mock [, $mode ] )
  ->検証するメソッド(期待する引数)

 Phake::verify($mock, Phake::times($n))->foo()
   foo()メソッドが$n回呼び出されたことを検証

 Phake::verifyNoIntaraction($mock)
   $mockオブジェクトのスタブメソッドが何も呼び出さ
   れなかったことを検証
20

Partial Mocks
 通常 Phake::mock() でモックオブジェクトを作成する
 と、すべてのメソッドがスタブ化される

 一部のメソッドのみスタブ化したい場合はパーシャル
 モックとして作成する

 パーシャルモックオブジェクトは基本的にはメソッドが
 そのまま呼び出されるが、Phake::when()で部分的にスタ
 ブメソッドに置き換えることが可能
21
22
23

Partial Mocks
 パーシャルモックが必要になるようであれば、部分的設
 計を見直すいい機会かも

 パーシャルモックでスタブ化した部分を別のクラスとし
 て抽出して、モックオブジェクトで置き換える方がたぶ
 ん素直でわかりやすいと思います
24

Installation
 pear config-set auto_discover 1
 pear install pear.digitalsandwich.com/phake
 include_pathを設定してPhake.phpを読み込むだけ
25

まとめ
Phakeを使うと直感的にモックオブジェクトを作れる

 思考の流れに沿ってスムーズにモックオブジェクトが
 作れるためテストが る

PHPUnitのMockObjectで十分なら無理に使わなくていい
んじゃないですかね……
26

Links
 http://phake.digitalsandwich.com/

 https://github.com/mlively/Phake


 http://fivestar.hatenablog.com/
   ご清聴ありがとうございました

20120327 phpstudy58-phake