【问题标题】:How to force a curl request in a PHP method to fail for a unit test如何强制 PHP 方法中的 curl 请求失败以进行单元测试
【发布时间】:2019-12-29 06:15:37
【问题描述】:

我正在使用单元测试覆盖一些遗留代码。我有一些看起来像这样的代码(我已经删除了与这个问题无关的位):

    public function search($query) {
        $query = urlencode($query);
        $url = 'https://example.com/search.php?q=' . $query;

        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => $url,
        ));
        $data = curl_exec($curl);

        if (!$data) {
            throw new Exception('An error occurred while trying to process the request.');
        }
    }

如何强制curl 请求失败,以便Exception 获得thrown?在完全覆盖之前,我不允许更改方法中的现有代码。除了查询字符串之外,URL 是硬编码的,所以我无法更改它,并且查询字符串是用urlencode() 正确编码的 URL,所以我不能通过格式错误的字符串。

查询是否有可以超出的安全字符串长度?也许我可以用ini_set() 更改设置?

† 我知道代码中的错误

【问题讨论】:

    标签: php unit-testing curl code-coverage


    【解决方案1】:

    cURL 有利于建立通信的几个环境变量,它们可用于影响 curl 操作,而无需调整测试的 php 代码。

    这些变量是:

    • http_proxy
    • https_proxy
    • no_proxy

    因此您可以在setUp() 中保留这些变量的当前值,并在tearDown() 中恢复它们。

    以下代码肯定会破坏你的 curl:

    putenv("https_proxy=localhost:5678");
    putenv("no_proxy=blah-blah-blah");
    

    【讨论】:

    • curl 尽管设置了https_proxy,但还是很高兴地检索到了该页面。
    • 你确定 putenv 有效果吗? - 请检查 getenv 以读取值(有时出于安全原因禁用了 putenv)。我还考虑了额外的环境变量“no_proxy”。如果您将“no_proxy”变量设置为“*”,则“https_proxy”变量将被忽略,因此也可以将其重置。
    • getenv() 为所有HTTP_PROXYHTTPS_PROXYNO_PROXY 返回false。当我使用putenv() 设置它们时,它们会返回设置给它们的值。
    • php.net/manual/en/function.getenv.php "local_only 设置为 true 仅返回本地环境变量(由操作系统或 putenv 设置)"。我认为本地环境变量对curl没有影响。
    • 它们(通过 putenv 进行本地覆盖)对我的测试有影响。否则我不会首先发布答案 :-) 看起来 php-extension(或 libcurl 本身)在您的设置中出于某种原因忽略了环境变量(无论用于设置它们的方法)。
    猜你喜欢
    • 2016-03-15
    • 2012-03-05
    • 1970-01-01
    • 2021-12-15
    • 2017-10-25
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2018-03-13
    相关资源
    最近更新 更多