如何模拟第三方api调用。这是从controller发生的。我在控制器中有这行代码。
public function store(){
$response = $request->post('http://thirdpaty.app/rmis/api/ebp/requests', [
"headers" => [
'Content-Type' => 'application/json',
],
"json" => [
"data"=>1
]
]);
$data = json_decode($response->getBody()->getContents());
$token = $data->token;
// Saving that token to database
}
从测试中我正在做
$response = $this->post('/to-store-method');
如何模拟api请求。这样,在测试中,我不必调用第三个api请求。
我现在正在做
if(app()->get('env') == 'testing'){
$token = 123;
}else{
//Api call here
}
是否有更好的替代方法进行这项测试
答案 0 :(得分:0)
您需要某种方式将模拟处理程序注入到控制器正在使用的Guzzle Client中。传统上,您要么通过构造函数传递Guzzle Client,要么通过可以在后台模拟(使用Mockery)的代码中的某些引用服务来利用依赖注入。
之后,请查看Guzzle文档,以获取有关如何在HTTP客户端中模拟请求的顶峰:
http://docs.guzzlephp.org/en/stable/testing.html
您将使用MockHandler通过构建伪造的请求和响应来执行类似于以下代码的操作。
// Create a mock and queue two responses.
$mock = new MockHandler([
new Response(200, ['X-Foo' => 'Bar'], 'Hello, World'),
new Response(202, ['Content-Length' => 0]),
new RequestException('Error Communicating with Server', new Request('GET', 'test'))
]);
$handlerStack = HandlerStack::create($mock);
$client = new Client(['handler' => $handlerStack]);
// The first request is intercepted with the first response.
$response = $client->request('GET', '/');
答案 1 :(得分:-1)
实际上,模拟网络库是一种不好的做法。我建议通过httpService包装网络请求,并模拟httpService来返回所需的响应。
public function store(){
$response = httpService.postData();
$data = json_decode($response->getBody()->getContents());
$token = $data->token;
// Saving that token to database
}
因此,您将从httpService.postData函数获得响应作为返回,并且可以模拟postData而不是网络库。