我目前正在编写一个从外部服务中检索信息的单元测试 - 我想在无法访问给定外部的情况下测试一个场景(因此,客户端没有外发访问权限)或服务已关闭。< / 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;
}
...
}
答案 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
。
我理解它并没有回答我最初的问题 - 虽然它让我认为如果给定的事物是不可测试的,那么可能它不应该被解决