簡體   English   中英

在phpunit中測試構造函數args

[英]Testing constructor args in phpunit

我們使用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 ,但即使我重構這個代碼讓我用它的mock替換Varien_Http_Client ,我也不明白如何通常*測試構造函數是用預期的參數調用的,因為構造函數被調用PHPUnit::getMock

我不需要模擬對象 ; 我需要一個模擬 如何測試使用預期參數調用構造函數?

*(在這種情況下,我知道如何解決特定於Varien_Http_Client這個問題,但是我可以用更多不透明的第三方代碼做什么?)

這就是我們所說的“不可測試”代碼。 在方法中構建依賴項時,無法模擬它們。 在模型中每次使用“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');

        (...)

最好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM