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

20120327 phpstudy58-phake

Embed Size (px)

Citation preview

Page 1: 20120327 phpstudy58-phake

Phakeで簡単 モックオブジェクト作成

Katsuhiro OGAWA @fivestr2012.03.27 - PHP勉強会@東京 #58

Page 2: 20120327 phpstudy58-phake

About Me小川 雄大 - OGAWA Katsuhiro @fivestr

株式会社クロコス

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

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

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

OOP、MVC、DDD

2

Page 3: 20120327 phpstudy58-phake

Agenda

スタブとモック

Phakeとは

Phake API

Phakeのインストール

3

Page 4: 20120327 phpstudy58-phake

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

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

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

4

Page 5: 20120327 phpstudy58-phake

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

stub out - もみ消す

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

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

定数に置き換える

5

Page 6: 20120327 phpstudy58-phake

サンプルFacebookクラスはFacebookが提供するPHP SDK。api()メソッドでAPIへアクセス

ClientクラスはFacebookオブジェクトを使ってデータアクセス

6

Page 7: 20120327 phpstudy58-phake

スタブで差し替えFacebookクラスのapi()メソッドを上書きして定数を返すようにすれば、Web APIへのアクセスをなくせる

上位モジュール

下位モジュール

7

Page 8: 20120327 phpstudy58-phake

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

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

8

Page 9: 20120327 phpstudy58-phake

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

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

9

Page 10: 20120327 phpstudy58-phake

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

10

Page 11: 20120327 phpstudy58-phake

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

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

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

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

11

Page 12: 20120327 phpstudy58-phake

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

JavaのMockitoがベース

PHPUnitにも対応

12

Page 13: 20120327 phpstudy58-phake

PHPUnit_MockObject

13

;

Page 14: 20120327 phpstudy58-phake

Phake

14

;

Page 15: 20120327 phpstudy58-phake

PhakePhake::mock

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

Phake::when

スタブメソッドの作成

Phake::verify

メソッドが正しく呼び出されたか

15

Page 16: 20120327 phpstudy58-phake

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

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

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

16

Page 17: 20120327 phpstudy58-phake

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

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

Phake::when($mock)->foo(Phake::anyParameters())

foo()メソッドが引数問わず呼び出される

17

Page 18: 20120327 phpstudy58-phake

Phake::when - AnswersthenReturn( $value )

$value を返す

thenThrow( $exception )

$exception をスロー

thenCallParent()

parent呼び出し

18

Page 19: 20120327 phpstudy58-phake

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

Phake::verify($mock, Phake::times($n))->foo()

foo()メソッドが$n回呼び出されたことを検証

Phake::verifyNoIntaraction($mock)

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

19

Page 20: 20120327 phpstudy58-phake

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

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

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

20

Page 21: 20120327 phpstudy58-phake

21

Page 22: 20120327 phpstudy58-phake

22

Page 23: 20120327 phpstudy58-phake

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

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

23

Page 24: 20120327 phpstudy58-phake

Installationpear config-set auto_discover 1pear install pear.digitalsandwich.com/phake

include_pathを設定してPhake.phpを読み込むだけ

24

Page 25: 20120327 phpstudy58-phake

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

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

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

25

Page 26: 20120327 phpstudy58-phake

Linkshttp://phake.digitalsandwich.com/

https://github.com/mlively/Phake

http://fivestar.hatenablog.com/

ご清聴ありがとうございました

26