gpt4 book ai didi

api - Laravel API测试-如何测试具有外部API调用的API

转载 作者:行者123 更新时间:2023-12-01 04:35:05 26 4
gpt4 key购买 nike

我的API代码

public function store (Request $request, $profileId)
{
$all = $request->all();
$token = AccessToken::with('users')->where('access_token',$request->input('access_token'))->first();

if($token && $token->users->isOwnProfile($profileId))
{
$rules = [
'access_token' => 'required',
'title' => 'required',
'description' => 'required',
'file_id' => 'required',
'audience_control' => 'required|in:' . join(',', PostRepository::$AUDIENCE_CONTROL),
'tags' => 'required',
];
$validator = Validator::make($all, $rules);

$error = $validator->errors()->toArray();
if ($validator->fails())
{
return $this->setStatusCode(401)
->setStatusMessage(trans('api.validation failed'))
->respondValidationMessage($error);
}
try {
$response = $this->postRepository->save($request, $profileId);
if(isset($response['error']))
return $this->messageSet([
'message' => $response['error']['message'],
], $response['error']['status_code']);

return $this->setDataType('post_id')
->setStatusCode('200')
->respondWithCreatedId(trans('api.Post created'), $response->id);
} catch (\Exception $e) {
return $this->respondInternalError(trans('api.processing error'));
}
}
return $this->respondInternalError('404 page');

}

从save方法,它调用另一个调用外部API的方法。
/*
* this function returns some response where it has profile_id for
* the file which in other save function is matched that the
* profile_id passed as parameter is same with file profile_id
*/
public function getFileDetails($file_id)
{
try
{
$response = json_decode((new Client())->request('GET', env('xyz','http://abc.xyz/api/v1').'/files/' . $file_id)->getBody()->getContents(), true);
}
catch (RequestException $e)
{
$response = json_decode($e->getResponse()->getBody()->getContents(), true);
}

return $response;

}

现在,这是我对API的测试功能。
public function testPostCreateChecksProfileMatchesCorrectly()
{
$this->json('POST', 'profiles/' . $this->getProfile()->id . '/posts' . '?access_token=' . $this->getAccessToken(), [
'title' => 'api testing title',
'description' => 'api testing description',
'audience_control' => 'public',
'tags' => [
'Animals',
'City'
],
'file_id' => '281'
])->seeJsonStructure([
'success' => [
'message',
'post_id',
'status',
],
]);
}

Now my question is how can I create a fake response for the external API when I am testing.



我正在使用 PHPUnit Laravel 5.2

最佳答案

您可以使用PHP VCR记录API请求的输出。
https://github.com/php-vcr/php-vcr
使用此软件包,您可以将其保存在tests/fixtures目录中。
因此,第一次之后,PHPUnit将读取此文件,而不执行其他请求。
并以此方式还将添加到您的GIT仓库中。
首先,您需要使用以下命令进行安装:

composer require php-vcr/php-vcr 
composer require php-vcr/phpunit-testlistener-vcr
第二个软件包将PHPUnit与PHP-VCR集成在一起。
然后添加到您的phpunit.xml之后
<listeners>
<listener class="VCR\PHPUnit\TestListener\VCRTestListener" file="vendor/php-vcr/phpunit-testlistener-vcr/src/VCRTestListener.php" />
</listeners>
然后在您的Laravel应用程序的tests目录中创建名为“fixtures”的目录。
现在我们可以像这样测试:
/** @test */
public function itShouldGetVenueGpsCoordinates()
{

$address = "Milano, viale Abruzzi, 2";
VCR::turnOn();
VCR::insertCassette('mapquestapi');
$coordinates = $this->venueService->getVenueGpsCoordinates($address);

VCR::eject();
VCR::turnOff();

$this->assertEquals(45, number_format($coordinates['lat'], 0));
$this->assertEquals(9, number_format($coordinates['lng'], 0));
}
测试将创建一个夹具,在我的情况下称为“mapquestapi”,您可以将其添加到GIT存储库中。因此,从第二次开始,您的测试将调用该API,将从该文件中加载数据,而不是发出新请求。
如果您订阅了Laracast,则可以在此处查看完整的视频教程。
https://laracasts.com/lessons/testing-http-requests

关于api - Laravel API测试-如何测试具有外部API调用的API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36331847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com