2

私は次のコードを持っています:

<?php

class X
{
    public function do($url)
    {
        $httpRequest = new \HttpRequest\Curl($url, $this->getOptions());
        $httpRequest->fire();
        // etc.
    }
    // ...
}

このクラスを単体テストできるようにするために、モックされたHttpRequestクラスを挿入したいと思います。これを行う1つの方法は、次のとおりです。

<?php

class X
{
    private $httpRequestClass;

    public function __construct($httpRequestClass = '\HttpRequest\Curl')
    {
        $this->httpRequestClass = $httpRequestClass;
    }

    public function do($url)
    {
        $httpRequest = new $this->httpRequestClass($url, $this->getOptions());
        $httpRequest->fire();
        // etc.
    }
    // ...
}

しかし、これは正しくないようです。他のアイデアはありますか?

4

2 に答える 2

1
 public function __construct($url, $httpRequestClass = null)
    {
        $this->url = $url;
        if ($httpRequestClass == null) //> Default
           $this->httpRequestClass = new HttpRequest\Curl($this->url);
        else
           $this->httpRequestClass = $httpRequestClass;
    }

したがって、このクラスを通常使用している場合は、1つのパラメーターで呼び出すだけです。

yourClass('your url');

それ以外の場合は、2番目の引数でistanceを渡します

yourClass('url', new MockedObj);

もちろん、デフォルトのオブジェクトを提供せずに、常に依存関係を注入する必要があります

于 2012-10-16T17:00:14.203 に答える
0

クラスはHttpRequest型のオブジェクトを生成する必要がありますが、必ずしもオブジェクトを初期化する必要はありません。たとえば、プロトタイプパターンを使用する必要がある場合があります。したがって、クラスはファクトリパターンを要求します。簡潔にするために、ファクトリクラスではなくファクトリコールバックを選択しました。

<?php

class X
{
    private $factoryCallback;

    public function __construct($factoryCallback = null)
    {
        $this->factoryCallback = $factoryCallback;
    }

    public function do($url)
    {
        $httpRequest = $this->createHttpRequest($url);
        $httpRequest->fire();
        // etc.
    }

    private function createHttpRequest($url)
    {
        $callback = $this->factoryCallback;
        if (is_callable($callback)) {
            return $callback($url, $this->getOptions());
        }
        return new \HttpRequest\Curl($url, $this->getOptions());
    }
    // ...
}

この例では、ヘルパーメソッドcreateHttpRequest()は少し冗長ですが、本番コードでのエラー処理に使用されます。

于 2012-10-21T13:39:44.887 に答える