#laravel #guzzle
#laravel #guzzle
Вопрос:
У меня есть функция входа в систему, которая вызывает curl через Http-запрос Guzzle.api работает нормально, и теперь мне нужно написать модульный тест для одного и того же api для всех случаев. Пожалуйста, помогите мне, как написать модульное тестирование для приведенной ниже функции.
public function login(Request $request)
{
$input = $request->all();
/*
* check whether all the required parameters are received
*/
$validator = Validator::make($input,[
'username' => 'required',
'password' => 'required'
]);
if($validator->fails())
{
// if the validation fails send error response
return $this->sendError('Validation Error',$validator->errors(),400);
//EOF
}
/*
* get the username and password from Request and url value from .env file
* and make a curl to server to check the user authentication
*/
$client = new GuzzleHttpClient(['http_errors' => false]);
$response = $client->request('POST', config('link'), [
'form_params' => [
'action' => 'login',
'username' => $input['username'],
'pwd' => $input['password']
]
]);
$response_body = json_decode($response->getBody(),true);
if(array_key_exists('success',$response_body))
{
if($response_body['success'] == 'yes')
{
$userId = $response_body['data']['profileData']['id'];
// check if user is already registered or not
$userObj = new User;
$isUserExists = $userObj->checkUserExists($userId);
// EOF
if($isUserExists < 1)
{
$createUser['id'] = $userId;
$createUser['name'] = $response_body['data']['profileData']['first_name']." ".$response_body['data']['profileData']['last_name'];
$createUser['email'] = $response_body['data']['profileData']['email'];
$createUser['password'] = bcrypt($input['password']);
$createUser['company_id'] = $response_body['data']['profileData']['company_id'];
$user = User::create($createUser);
}
else
{
$user = User::find($userId);
}
// check if company already exists or not else register new company
$companyObj = new Company;
$companyId = $response_body['data']['profileData']['company_id'];
$isCompanyExists = $companyObj->checkCompanyExists($companyId);
if($isCompanyExists < 1)
{
$createCompany['id'] = $companyId;
$createCompany['name'] = $response_body['data']['profileData']['comp_name'];
$company = Company::create($createCompany);
}
// EOF
// send the response back to the appliaction
$success['user_id'] = $userId;
$success['company_id'] = $response_body['data']['profileData']['company_id'];
$success['token'] = $user->createToken('silva-reborn')-> accessToken;
return $this->sendResponse($success,'Login successful');
// EOF
}
else
{
// Invalid login
return $this->sendError($response_body['msg'], array() ,401);
// EOF
}
}
else
{
return $this->sendError("Invalid url", '' ,404);
}
}
Этот api работает отлично, теперь мне нужно написать модульный тестовый пример для этого api.Как это сделать?
Комментарии:
1. Если вы управляете API, то пишите модульные тесты для самого API, а не для запроса, который попадает в API. Если вы не управляете API, какой смысл писать модульный тест? Не похоже, что вы сможете это исправить, если оно сломается
2. Вы должны смоделировать клиент Guzzle и его ответы. У Guzzle есть некоторая документация о том, как это сделать.
Ответ №1:
Я думаю, что нет специального способа протестировать связанный с Guzzle код в Laravel, но общий подход заключается в использовании Guzzler или промежуточного программного обеспечения History (подробнее читайте в документах).
Оба варианта хорошо работают с PHPUnit и предоставляют вам способ имитировать и анализировать запросы, не выполняя их на самом деле.