测试离线连接

时间:2017-11-07 18:01:24

标签: laravel phpunit laravel-5.4 guzzle

我目前正在编写一个从外部服务中检索信息的单元测试 - 我想在无法访问给定外部的情况下测试一个场景(因此,客户端没有外发访问权限)或服务已关闭。< / p>

所以,这可能是一个显而易见的问题,但是为了测试的目的,如何在PHP / Laravel / Guzzle中禁用出站连接。

每条评论 - 我想测试的代码:

public function getRoadworks($bb)
{
    // assume that $bb = [0, 0, 1, 1];

    // can receive the response?
    try {
        $client = new Client();
        $response = $client->request("GET", config('virtual-earth.api.base_url').implode(",", $bb), [
            'query' => [
                'key' => config('virtual-earth.credentials.key')
            ]
        ]);
    }
    catch(\Exception $e)
    {
        return false;
    }

    ...
}

2 个答案:

答案 0 :(得分:1)

由于String jsonText = "some_text_in_json_format"; WebTarget target = "some_url/id" Response response = target.resolveTemplate("id", id).queryParam("overwrite", false).request(MediaType.APPLICATION_JSON) .header("Authorization", "Basic " + authInfo).put(Entity.json(jsonText)); 直接在类中实例化,因此在代码的当前状态下,您无法模拟客户端。如果您有代码,并且能够修改它,我建议您将其添加到函数签名中

Client()

这样,您仍然可以向后兼容,因此使用public function getRoadworks(Client $httpClient = null) { $bb = [0, 0, 1, 1]; // can receive the response? try { $client = $httpClient ? : new Client(); $response = $client->request("GET", config('virtual-earth.api.base_url').implode(",", $bb), [ 'query' => [ 'key' => config('virtual-earth.credentials.key') ] ]); } catch(\Exception $e) { return false; } ... } 的函数仍然有效,您将可以模拟客户端。我同意这不是最好的方法,改变你的代码用于测试目的,但在开始时这个功能没有正确设计用于测试。完成后,您将能够模拟客户端:

getRoadworks

答案 1 :(得分:0)

感谢@olibiaz将这个想法植入我的脑海,我感觉更舒服,基本上是 - 将Service注入需要它的方法,而不是Client ,所以代码变成:

public function getRoadworks($bb, Service $service)
{
    // assume that $bb = [0, 0, 1, 1];
    $data = $service->getData($bb);

    if (!$data)
        return false;

    ...
}

因此 - 是的,建议的注入仍然存在,但这种方法也允许使用不同的服务,其中一个是VirtualEarthService

我理解它并没有回答我最初的问题 - 虽然它让我认为如果给定的事物是不可测试的,那么可能它不应该被解决