20120327 phpstudy58-phake

Post on 11-Jul-2015

2277 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

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

top related