5

Varien_Http_Client次のように、Magento 拡張機能から http リクエストを作成するために使用します。

public function callApi(…)
{
    <SNIP>

    // Set default factory adapter to socket in case curl isn't installed.
    $client = new Varien_Http_Client($apiUri, array(
        'adapter' => 'Zend_Http_Client_Adapter_Socket',
        'timeout' => $timeout, 
    ));
    $client->setRawData($xmlDoc->saveXML())->setEncType('text/xml');
    $response = $client->request($method);
    $results = '';
    if ($response->isSuccessful()) {
        $results = $response->getBody();
    }
    return $results;
}

の内部のテストを避けるべきであることは理解していVarien_Http_Clientます。むしろ、正しい入力を送信し、その出力を正しく処理していることをテストする必要があります。簡単にモックVarien_Http_Clientできますが、このコードをリファクタリングしてVarien_Http_Clientをそのモックに置き換えても、コンストラクターが によって呼び出されるため、コンストラクターが予想される引数で呼び出されたことを一般的に*テストする方法がわかりませんPHPUnit::getMock

モックオブジェクトは必要ありません。モッククラスが必要です。コンストラクターが予想される引数で呼び出されたことをテストするにはどうすればよいですか?

* (この場合、私は に特有の問題を回避する方法を知っていますVarien_Http_Clientが、より不透明なサードパーティ コードで何ができるでしょうか?)

4

1 に答える 1

4

これは、「テストできない」コードと呼ばれるものです。メソッド内で依存関係を構築する場合、それらをモックする方法はありません。モデルで「new」キーワードを使用するたびに、内部でオブジェクトを作成するのではなく、オブジェクトを注入することを検討する必要があるというシグナルです。私の意見では、このルールの唯一の例外は、「データ コンテナー」オブジェクトまたはファクトリ クラスを作成する場合です。ただし、これらの場合、メソッドがオブジェクトを返すため、おそらくオブジェクトをテストできます。

あなたが言ったように、あなたが示した方法には少しリファクタリングが必要です。

class ApiClass
{
    protected $client;

    public function __construct(Varien_Http_Client $client)
    {
        $this->client = $client;
    }

    public function callApi()
    {
        $this->client->setRawData($xmlDoc->saveXML())->setEncType('text/xml');

        (...)

一番!

于 2013-07-01T10:46:10.870 に答える