Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20120327 phpstudy58-phake

2,929 views

Published on

Published in: Technology
  • Be the first to comment

20120327 phpstudy58-phake

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

×