AspectMock-PHPコードをテストする

どのくらいの頻度で自転車を書きますか? 私もあなたの隣に座れますか? しかし、実際には私の自転車は特別です。 たった1日で、シンプルで、三輪で、リベットで留められたように見えます。 しかし、1つのトリックがあります-それは車のエンジンで動作します。 彼は何ができますか?



そして見て:



<?php $class = MySingleton::getInstance(); var_dump($class instanceof MySingleton); // => (bool)true var_dump($class instanceof DOMDocument); // => (bool)false //     test::double('MySingleton', ['getInstance' => new DOMDocument]); var_dump($class instanceof MySingleton); // => (bool)false var_dump($class instanceof DOMDocument); // => (bool)true ?>
      
      







ああ、私たちはシングルトンを変更しました! 静的メソッドを再定義しました。 今の生き方は?

しかし、質問は今では異なります。その前に私たちはどのように住んでいたのですか?



AspectMockをご覧ください 。 PHPのモブとスタブ用の最もシンプルだが最も強力なフレームワーク。

新しい超シンプルなテストアシスタント。 NightTigerの Go AOPに基づいています。



そのため、AspectMockのアイデアは非常に単純です。テストが不可能であるために、以前はPHPで「悪い習慣」と見なされていたすべてをテストできるようにすることです。 静的メソッド、シングルトン、クラスメソッド-これらはすべて、リアルタイムでの変更に役立ちます。 任意のメソッドの呼び出しを確認できます。 以下に例を示します。



 <?php class UserService { function createUserByName($name) { $user = new User; $user->setName($name); $user->save(); } } ?>
      
      







残念ながら、従来の方法を使用してこの方法の単体テストを行うことはできません。 何をするにしても、save()メソッドが呼び出され、データベースにアクセスします。 ただし、AspectMockでは、これはまったく問題ではありません。



 <?php function testUserCreate() { $user = test::double('User', ['save' => null])); $service = new UserService; $service->createUserByName('davert'); $this->assertEquals('davert', $user->getName()); $user->verifyInvoked('save'); } ?>
      
      







saveメソッドが呼び出されましたが、ダミーに置き換えられました。 満足しています。ベースはそのままで、ユーザー名が割り当てられています。 100%の被覆率、断熱材が存在します。



なぜこれだけなのですか?





PHPでは、テスト不能なコードを不良とみなすのは奇妙な習慣になりました。 上記の例は、ActiveRecordパターンを使用すると、このようなテスト不能なコードが生成されることを示しています。 彼は悪いですか? まあ、結局のところ嘘。 さまざまなヨットの多くのORMに実装されている良好なパターン。



コードの「テスト容易性」がPHP言語自体の技術的な制限によってのみ決定されるという点で、この慣行は奇妙です。

したがって、コードを記述する前に、すぐに留意する必要があります。それをテストする方法です。 そして、必ず依存性注入を使用してください。 必須です。



それでは、PHPのほとんどすべてのOOPコードが単体テストに適していることを想像してみましょう。 不要なサービスを生成し、それらを注入してから、PHPUnitの複数行構造を使用してmokiを作成するのではなく、コードの可読性とその有効性に焦点を合わせた方が良いでしょうか?



ただし、実際には、ほとんどの開発者はこの問題にもっと簡単に関係しています。 彼らはユニットテストをまったく書きません。



AspectMockを使用すると、効率的なコードの作成に集中できます。 もちろん、正しいアーキテクチャ、適切な標準に従い、依存関係の使用を監視する必要がありますが、PHPの技術的能力に人為的に制限する必要はなくなりました。 あるすばらしい人が言ったように、 「何も真実ではありません。 すべて許可されています。」



どのように機能しますか?





AspectMock自体は非常にシンプルです。たった8つのファイルです。 そこに勉強することはほとんどありません。 ただし、 すでにHabré読んでいる Go AOPは、pointcut'ovを介してあらゆるアプリケーションメソッドに統合するための優れたプラットフォームを提供します。 好みに基づいて、それらをダミーに置き換えたり、実装を登録したりできます。 Go AOPは、プロキシクラスをリアルタイムで作成し、階層に埋め込みます。 自動リストを変更することで機能します。 すべての一般的なフレームワークと互換性があります: Symfony2Zend Framework 2YiiLaravel 。 Go Aopに慣れていない場合は、Go Aopで遊ぶこと強くお勧めします



AspectMockを適用する場所





まあ、それは間違いなく生産ではありません。 AspectMockはテスト専用に作成され、コンポーザーを介してインストールされ、 PHPUnitおよびCodeceptionで動作します。 AspectMockはどれくらい安定していますか? Go AOP自体とまったく同じです。 ご存知のように、プロジェクトはまだ非常に実験的です。 現在のバージョンは0.1.0です。 最も難しいのは初期インストールです。 試してみてください。すべてがあなたのために起動したら、それはハーフキックで動作するはずです。



あなたのフィードバックは非常に興味深いものになります。 ご清聴ありがとうございました。



AspectMockはGitHubにあります



Upd: AspectMockの動作を示すビデオが登場しました

よく見てください。何度も読むよりも一度だけ見たほうがいいです。



All Articles