Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

3 739 vues

Publié le

Nagoya.php vol.7 LT資料

Publié dans : Logiciels
  • Soyez le premier à commenter

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のまとめ 静的メソッドや関数のモックを作成できます モック作成の構文は簡単で覚えられます テストできないものはほぼありません ガンガンテストしましょう♪

×