【问题标题】:Unable to find wrapper when testing Guzzle call with PHPUnit使用 PHPUnit 测试 Guzzle 调用时找不到包装器
【发布时间】:2015-08-26 01:30:12
【问题描述】:

我正在为我正在开发的 API 编写单元测试。该 API 是在 Codeigniter 框架中编写的,该框架使用 Guzzle 调用另一个 API。我正在编写的测试验证 API 调用是否返回正确的响应。

Test.php 文件包含以下代码

require '/application/libraries/apiWrappers/Breathehr.php';

class BreathehrTest extends PHPUnit_Framework_TestCase {

    public function testCanReturnEmployeeArray() {
        $breatheHR = new Breathehr();

        $employees = $breatheHR->list_employees(1);
        $this->assertArrayHasKey('employees', $employees);
    }


}

正在测试的方法如下

class Breathehr {

    function __construct() {

    }

    public function list_employees($page)
    {
        $client = new GuzzleHttp\Client(
            ['base_uri' => 'https://xxx/',
                'headers' => ['X-API-KEY' => 'xxx'],
                'verify' => false]
        );

        $request = $client->get('employees?page='.$page);
        $employees = json_decode($request->getBody(true));

        $employeeData = array(
            'employees' => array(),
            'pagination' => array()
        );

        $i = 0;
        foreach($employees->employees as $employee) {
            if($employee->status !== 'Ex-employee') {
                $employeeData['employees'][$i]['firstName'] = $employee->first_name;
                $employeeData['employees'][$i]['lastName'] = $employee->last_name;
                $employeeData['employees'][$i]['jobTitle'] = $employee->job_title;
                if(isset($employee->line_manager)) {
                    $employeeData['employees'][$i]['lineManagerName'] = $employee->line_manager->first_name . ' '. $employee->line_manager->last_name;
                    $employeeData['employees'][$i]['lineManagerID'] = $employee->line_manager->id;
                }
                $employeeData['employees'][$i]['workingHours'] = $employee->full_or_part_time;
                $employeeData['employees'][$i]['email'] = $employee->email;
                $employeeData['employees'][$i]['workPhone'] = $employee->ddi;
                $employeeData['employees'][$i]['personalMobile'] = $employee->personal_mobile;
                $employeeData['employees'][$i]['homeTelephone'] = $employee->home_telephone;
                $employeeData['employees'][$i]['birthday'] = $employee->dob;
                $i++;
            }
        }

        $nextLink = $request->getHeader('Link');
        $nextLinkSplit = explode(',', $nextLink[0]);

        $pageination = array();

        foreach($nextLinkSplit as $data) {
            $split = explode(';', $data);
            preg_match('/"(.*?)"/', $split[1], $keyMatch);
            $key = isset($keyMatch[1]) ? $keyMatch[1] : FALSE;
            $number = substr($split[0], -2, 1);

            $pageination[$key] = $number;
        }

        array_push($employeeData['pagination'], $pageination);

        return $employeeData;
    }

}

API 调用通过 Postman 和浏览器正常工作,但从命令行运行 PHPUnit 的结果如下

RuntimeException:创建资源时出错:[消息] fopen():无法 找到包装“https” - 当你忘记启用它 配置PHP?

[消息] fopen(https://api.breathehr.com/v1/employees?page=1): 失败 打开流:没有这样的文件或目录

我用谷歌搜索了错误消息,发现了这个 SO 帖子 Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?

进行这些更改没有任何区别。值得注意的是,这是在本地主机上运行 MAMP。

有什么想法吗?

谢谢

【问题讨论】:

  • 你用本地 dns 覆盖你的 URL 吗?
  • 不,只是标准的 MAMP 设置,在 localhost 上运行
  • 有时 CLI 使用与 Apache 不同的 php.ini,因此您通过 WAMP 菜单进行的设置不适用于 CLI。启动命令 php -i | grep ssl 检查是否加载了正确的扩展。以同样的方式你可以找到 php.ini 脚本:php -i | grep ini
  • 嗨,Matteo,这就是问题所在,CLI 正在从 C:\Windows 目录加载 php.ini。非常感谢你的帮助。请随时添加此作为答案,我会接受。
  • 啊啊啊!!!嗨@Pete 对不起...

标签: php codeigniter phpunit guzzle


【解决方案1】:

有时 CLI 使用的 php.ini 与 Apache 不同,因此您通过 WAMP 菜单进行的设置不适用于 CLI。

检查是否加载了正确的扩展启动

command php -i | grep ssl 

以同样的方式你可以找到 php.ini 脚本:

php -i | grep ini

希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2016-01-14
    • 2018-03-11
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多