gpt4 book ai didi

php - 在 phpunit 中测试构造函数参数

转载 作者:可可西里 更新时间:2023-10-31 23:21:51 24 4
gpt4 key购买 nike

我们使用 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 的问题,但是我可以用更不透明的第三方代码做什么?)

最佳答案

这就是我们所说的“不可测试”代码。当您在方法中构建依赖项时,无法模拟它们。在你的模型中每次使用“new”关键字都是一个信号,表明你应该考虑注入(inject)对象而不是在内部创建它。在我看来,该规则的唯一异常(exception)是创建“数据容器”对象或工厂类时。但在这些情况下,您可能可以测试该对象,因为方法会返回它。

所以正如你所说,你展示的方法需要一点重构,例如:

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');

(...)

最好!

关于php - 在 phpunit 中测试构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17393512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com