モックオブジェクトは、実際のオブジェクトを置き換え、実際のオブジェクトの実行動作をシミュレートするために単体テストで使用される代替物です。オブジェクトのシミュレーションは、オブジェクトの依存関係がまだ実装されていない場合、またはシミュレートが困難な要因に依存している場合に役立ちます。
ご想像のとおり、オブジェクトをock笑すると、紹介で言及したトリッキーな状況を解決できます。しかし、模擬オブジェクトとは何ですか?模擬オブジェクトは、実際のオブジェクトの実際の実装を置き換える代替オブジェクトです。なぜ実際のオブジェクトの代わりに代替オブジェクトが必要なのですか?モックオブジェクトは、テストケースで実際のオブジェクトの実行動作をシミュレートするために単体テストに使用されます。それらを使用することにより、実装しているオブジェクトの機能をテストしやすくなります。モックオブジェクトを使用する場合の便利な状況を次に示します。
オブジェクトの1つ以上の依存関係の実際の実装はまだ実装されていません。あなたのタスクがデータベース内のいくつかのデータの処理を行うことであると仮定します。オブジェクトまたはデータリポジトリへの何らかの形式のデータアクセスを呼び出すかもしれませんが、データベースがまだ設定されていない場合はどうなりますか?データが利用可能である場合(私は何度も遭遇しました)、またはデータベースを照会するコードがまだ記述されていない場合はどうなりますか?データアクセスオブジェクトをシミュレートして、事前定義された値を返すことにより、実際のデータアクセスオブジェクトをシミュレートします。これにより、データベースのセットアップ、データの検索、またはデータベースを照会するコードの書き込みの負担から救われます。
練習中のシミュレーションオブジェクト
モックオブジェクトが何であるかがわかったので、いくつかの実用的な例を見てみましょう。 Facebookの投稿にいいね!やコメントを数えるなど、前述のシンプルな機能を実装します。次の単体テストから始めて、オブジェクトがどのように呼び出されるか、そして返品値がどうなるかについての期待を定義します。このテストを実行すると、結果が失敗します。これはまだ何も実装していないために予想されます!それでは、サービスの実装を書きましょう。もちろん、最初のステップはFacebookからデータを取得することです。
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
Facebookオブジェクトが空であるため、このテストも失敗します。 FacebookアプリケーションIDなどを使用して実際のインスタンスを作成して実際の実装を挿入できますが、何のために?私たちは皆、そうすることで、目の前のタスクの痛みから逸脱することを知っています。モックオブジェクトを注入することでこれを回避できます!モックオブジェクトを使用する方法(少なくとも私たちの場合)は、get()メソッドを使用してクラスを作成し、モック値を返すことです。これは、実際のオブジェクトがock笑されているだけであるときに、実際のオブジェクトの実装を呼び出すことをクライアントにだましてだましてください。
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
モッククラスができたので、インスタンスをインスタンスにして、それを使用できるようにStatusserviceに注入しましょう。ただし、最初に、セッターを使用して、Facebookライブラリで使用するStatusserviceを更新します。
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { // test here } class MockFacebookLibrary { public function get($id) { return array( // mock return from Facebook here ); } }
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
テストは依然として失敗しますが、少なくとも非オブジェクトでメソッドを呼び出すことに関するエラーを受け取ることはありません。さらに重要なことは、この依存関係を満たす必要性を解決したことです。これで、割り当てられているタスクのビジネスロジックの作成を開始し、テストに合格することができます。
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
さらに一歩進んでください:シミュレーションフレームワークを使用
最初に開始するときに手作りのモックオブジェクトを使用できますが、自分自身を発見したように、ニーズがより複雑になるにつれて、実際のモックフレームワークを使用する必要があるかもしれません。この記事では、phpunitに付属の模擬フレームワークの使用方法を示します。私の経験では、手動で書かれたモックオブジェクトを使用することと比較して、模擬フレームワークを使用することにはいくつかの利点があります。
シミュレーションフレームワーク Phpunitを使用してシミュレーションフレームワークに焦点を当てましょう。ステップは実際には非常に直感的であり、それを把握すると、第二の性質になります。このセクションでは、Phpunitのシミュレーションフレームワークを使用して、例の場合の模擬オブジェクトを作成します。ただし、これを行う前に、手作りのモックオブジェクトを使用するテストでコードラインをコメントまたは削除します。通過できるように、最初に失敗する必要があります。その後、新しいシミュレーションの実装を挿入します。
phpunitを実行しているときにテストが失敗することを確認します。次に、オブジェクトを手動でシミュレートする方法と呼び出したい方法について考えてください。私たちは何をしましたか?
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { // test here } class MockFacebookLibrary { public function get($id) { return array( // mock return from Facebook here ); } }
最初のステップは、シミュレートするオブジェクトを識別することです。上記の分析の例関数では、Facebookライブラリをシミュレートしました。私たちは最初のステップと同じことをしています。
classをモックするクラスを定義したので、クラス内のメソッドを模倣するメソッドを知る必要があり、メソッドが存在する場合は、パラメーターと戻り値を指定します。ほとんどの場合に使用する基本的なテンプレートは、おおよそ次のとおりです。
メソッド名(必須)を指定します。
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
モックFacebookオブジェクトをもう一度作成したら、再びサービスに注入してください:
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
さて、もう一度テストに合格する必要があります。おめでとう!モックオブジェクトでテストを開始しました!うまくいけば、より効果的にプログラムできることを願っています。最も重要なことは、将来の依存関係で遭遇する障害を取り除くことができることを願っています。
Fotoliaの写真(モックオブジェクトテストに関するFAQセクションをここに追加する必要があります。コンテンツは入力テキストのFAQパーツと一致していますが、複製を避けるために少し書き直して研磨する必要があります) >以上がPHPマスター|モックオブジェクトテストの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。