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.

AspectMock 最強のモッキングフレームワーク

3,732 views

Published on

Nagoya.php vol.7 LT資料

Published in: Software
  • Be the first to comment

AspectMock 最強のモッキングフレームワーク

  1. 1. AspectMock 最強のモッキングフレームワーク 2014/11/16 Nagoya.php vol.7 kenjis
  2. 2. AspectMockとは? AspectMockは普通じゃないPHPの モッキングフレームワーク。 アスペクト指向プログラミングとイケてる Go-AOPライブラリのパワーで、 AspectMockはほとんど全てのPHPコードの スタブとモックを作成できる! https://github.com/Codeception/AspectMock
  3. 3. 特徴静的メソッドのテストダブルの作成 メソッドの動的な変更 名前空間内の関数のテストダブルの作成 覚えられるシンプルなシンタックス
  4. 4. つまりNothing is Untestable! Easy to Use
  5. 5. 要件PHP 5.4+
  6. 6. インストール方法$ composer require codeception/aspect-mock:* --dev 注意 重いので本番環境にはインストールしない方がよい 必ずPHPUnitもプロジェクト内にインストールする
  7. 7. 設定例require __DIR__.'/../vendor/autoload.php'; // Composerのオートローダ $kernel = AspectMockKernel::getInstance(); $kernel->init([ 'debug' => true, 'includePaths' => [__DIR__.'/../src'], 'cacheDir' => __DIR__.'/cache/AspectMock', ]); Composerのオートローダを使っている場合
  8. 8. $kernel->init()の引数項目 説明 appDir Webアプリのルートフォルダ。デフォルトは Composerのvendorフォルダのあるフォルダ includePaths AOPを適用して置き替えたいフォルダ excludePaths AOPを適用しないフォルダ。テストフォルダ は指定すべき cacheDir キャッシュフォルダ
  9. 9. PHPUnitの設定phpunit.xml <phpunit bootstrap="bootstrap.php" backupGlobals="false"> TestCase <?php use AspectMockTest as test; abstract class TestCase extends PHPUnit_Framework_TestCase { protected function tearDown() { test::clean(); // 登録したテストダブルを削除 } }
  10. 10. 静的メソッドの置き換え 構文 test::double('クラス名', ['メソッド名' => 返り値]); @return ClassProxy 例 $fs = test::double('FuelCoreFieldset', ['repopulate' => true]); $model_mail = test::double( 'Model_Mail', ['send' => function() { throw new EmailSendingFailedException; }] );
  11. 11. 静的メソッドの置き換え 例:引数の値によりモックが返す値を変更する test::double('FuelCoreConfig', ['get' => function ($arg) { if ($arg === 'foo.bar') { return 'foo.bar'; } else { return 'baz'; } }]); 例:引数の値により実際のメソッドを実行する test::double('FuelCoreConfig', ['get' => function ($arg) { if ($arg === 'foo.bar') { return 'foo.bar'; } else { // モックせずに実際のメソッドを実行させる return __AM_CONTINUE__; } }]);
  12. 12. 関数の置き換え 構文 test::func('名前空間', '関数名', 返り値); @return FuncProxy 例 $func = test::func(__NAMESPACE__, 'header', '');
  13. 13. メソッド呼び出しの検証 例 $user = test::double(new User, ['getName' => 'davert']); $this->assertEquals('davert', $user->getName()); $user->verifyMethodInvoked('getName'); // 呼び出されたか? $user->verifyMethodInvoked('setName', ['davert']); // 引数の指定 $user->verifyMethodInvokedOnce('getName'); // 一度だけ? $user->verifyMethodNeverInvoked('setName'); // 呼び出されない? $user->verifyMethodInvokedMultipleTimes('setName', 1); // 呼び出し回数の指定
  14. 14. モックオブジェクトの取得 ClassProxy // コンストラクタを呼ばずにモックオブジェクトを取得 $user = test::double('User')->make(); // コンストラクタを呼び出しモックオブジェクトを取得 $user = test::double('User')->construct([ 'name' => 'davert', 'email' => 'davert@mail.ua' ]); InstanceProxy $user = test::double(new User)->getObject();
  15. 15. 仕組みAOPによりモックするメソッドを インターセプトして置き換える
  16. 16. 仕組みGo AOPを使いPHPファイルを動的に書き換え class User { function setName($name) { $this->name = $name; } } ↓ class User { function setName($name) { if (($__am_res = __amock_before($this, __CLASS__, __FUNCTION__, array(), false)) !== __AM_CONTINUE__) return $__am_res; $this->name = $name; } }
  17. 17. さらに知るには 『 』 https://github.com/Codeception/AspectMock Understanding AspectMock Nothing is Untestable: AspectMock in Action レガシーコードとAspectMock はじめてのフレームワークとしてのFuelPHP 改訂版
  18. 18. AspectMockのまとめ 静的メソッドや関数のモックを作成できます モック作成の構文は簡単で覚えられます テストできないものはほぼありません ガンガンテストしましょう♪

×