Как написать модульное тестирование для запроса guzzle в laravel?

#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 и предоставляют вам способ имитировать и анализировать запросы, не выполняя их на самом деле.