我的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',
],
]);
}
现在我的问题是如何为外部创建虚假回复 我在测试时使用的是。
我正在使用 PHPUnit
&的 Laravel 5.2
答案 0 :(得分: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 应用程序的测试目录中创建名为“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
答案 1 :(得分:1)
首先,永远不要测试你不拥有的东西。外部API调用是您不认为的。可能存在数千个可能出错的问题或用例,例如提交数据,网络错误或内部错误。每个案例你应该测试一下情况,这很乏味。而是使用moc对象并对此提出一些期望。收听此播客,http://www.fullstackradio.com/37这将有助于您清楚地了解。
尝试将代码分解为小块,然后分别测试每个块。你期望从一次测试中得到太多。将验证逻辑放在FormRequest类中,这将对您有所帮助。