PhactoryとPHPUnitを使用して、PHP Propelプロジェクトのテスト スイートのセットアップに取り組んでいます。現在、外部リクエストを行う関数の単体テストを試みており、そのリクエストのモック応答をスタブしたいと考えています。
テストしようとしているクラスのスニペットを次に示します。
class Endpoint {
...
public function parseThirdPartyResponse() {
$response = $this->fetchUrl("www.example.com/api.xml");
// do stuff and return
...
}
public function fetchUrl($url) {
return file_get_contents($url);
}
...
そして、これが私が書こうとしているテスト関数です。
// my factory, defined in a seperate file
Phactory::define('endpoint', array('identifier' => 'endpoint_$n');
// a test case in my endpoint_test file
public function testParseThirdPartyResponse() {
$phEndpoint = Phactory::create('endpoint', $options);
$endpoint = new EndpointQuery()::create()->findPK($phEndpoint->id);
$stub = $this->getMock('Endpoint');
$xml = "...<target>test_target</target>..."; // sample response from third party api
$stub->expects($this->any())
->method('fetchUrl')
->will($this->returnValue($xml));
$result = $endpoint->parseThirdPartyResponse();
$this->assertEquals('test_target', $result);
}
テスト コードを試してみたところ、 でモック オブジェクトを作成していてgetMock
、それを使用していないことがわかりました。したがって、関数fetchUrl
は実際に実行されますが、これは望ましくありません。しかし、Phactory で作成されたendpoint
オブジェクトを使用できるようにしたいと考えています。これは、ファクトリ定義から適切なフィールドがすべて取り込まれているためです。
既存のオブジェクトでメソッドをスタブする方法はありますか? fetch_url
作成したばかりの$endpoint
Endpoint オブジェクトを スタブできる
でしょうか?
それとも、私はこれについてすべて間違っているのでしょうか。外部 Web 要求に依存する機能を単体テストするためのより良い方法はありますか?
「Stubbing and Mocking Web Services」に関する PHPUnit のドキュメントを読みましたが、そのためのサンプル コードは 40 行あり、独自の wsdl を定義する必要はありません。SO の善良な人々がそうでないと強く感じない限り、これが私にとってこれを処理する最も便利な方法であるとは信じがたいです。
助けてくれてありがとう、私は一日中これに夢中でした。ありがとう!!