[英]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.