Как тестировать и имитировать ответы жрать в разных ситуациях?

Я хочу протестировать свой API-контроллер, используя некоторые запросы от других служб. У меня есть одна просьба сделать ссылку для скачивания.

  1. это мой маршрут API

    Route::group(['prefix' => '/v1'], function () {
    Route::get('/exampledl', 'DownloadController@downloadChecker');
    });
    
  2. Контроллер DownloadChecker проверяет, является ли пользователь администратором или подписчиком, делает ли запрос на жадность к одной из моих служб в другом домене, если не делает еще один запрос на жадность к другой службе, и для каждой ситуации ответы разные. Это часть проверки контроллером роли администратора.

    $client = new Client();
    try {
        $response = $client->request('GET', 'https://www.example.com/api/user?u=' . $request->uid);
        $json = \GuzzleHttp\json_decode($response->getBody()->getContents(), True);
    
        // if user doesn't exist in CM
    
        //this part has been written to avoid repeating code
        if (array_key_exists('user', $json) && $json['user'] == null) {
            abort(403);
        }
        elseif (in_array("administrator", $json['Roles'])) {
            User::create([
                'uid'               => (int)$request->uid,
                'subscription.role' => 'administrator',
            ]);
            $client = new Client();
    $response = $client->request('GET', "https://vod.example2.com/vod/2.0/videos/{$a_id}?secure_ip = {$u_ip}", [
        'headers' => [
            'authorization' => '**********'
        ]
    ]);
    $json = \GuzzleHttp\json_decode($response->getBody()->getContents(), TRUE);
    
    if (isset($json['data']['mp4_videos'])) {
        $links = [];
        foreach ($json['data']['mp4_videos'] as $mp_video) {
            if (stripos($mp_video, "h_144") !== false) {
                $links['144p'] = $mp_video;
            }
            elseif (stripos($mp_video, "h_240") !== false) {
                $links['240p'] = $mp_video;
            }
            elseif (stripos($mp_video, "h_360") !== false) {
                $links['360p'] = $mp_video;
            }
            elseif (stripos($mp_video, "h_480") !== false) {
                $links['480p'] = $mp_video;
            }
            elseif (stripos($mp_video, "h_720") !== false) {
                $links['720p'] = $mp_video;
            }
            elseif (stripos($mp_video, "h_1080") !== false) {
                $links['1080p'] = $mp_video;
            }
        }
        }
    
  3. один из моих тестов.

    public function test_user_notExist_admin()
    {
    $client = new Client();
    $response = $client->request('GET', 'https://www.example.com/api/user_days_and_roles?u=' . request()->uid);
    $json = \GuzzleHttp\json_decode($response->getBody()->getContents(), True);
    
    $this->get('/api/v1/exampledl?uid=1&n_id=400&u_ip=104.58.1.45&dl_id=a81498a9')
        ->assertStatus(200)
        ->assertSee('links');
    
    $this->assertDatabaseHas('users', [
        'uid'               => (int)request('uid'),
        'subscription.role' => 'administrator',
    ]);
    }
    

Есть некоторые другие проверки условий, и я не уверен, как издеваться над этими разными ситуациями.

Должен ли я сделать модульный тест для каждой ситуации? Или есть способ заставить guzzle в тестовой среде возвращать собственный ответ? Или любым другим способом?

Вот несколько статей, которые могут указать вам правильное направление: Как имитировать Guzzle-запрос для PHPUnit; Модульное тестирование Guzzle внутри контроллера Laravel с PHPUnit

cfnerd 29.01.2019 17:06

Я не мог получить ответ по этим ссылкам. Я использую более новую версию Laravel и PHPUnit от них.

Mahmood Afzalzadeh 04.02.2019 12:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
885
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я получил ответ. для имитации функции в разных ситуациях просто нужно использовать $mock = \Mockery::mock и makePartial(); вот так, и это позволяет нам делать каждый возврат, который мы хотим, без выполнения функции:

public function test_user_notExist_admin()
{
  $mock = \Mockery::mock(DownloadController::class, [
            'get_download_links_from_download_server'       => $this->links,
            'post_details_to_log_server'                    => [200, "new"],
            'connect'                                       => [
                "Roles"         => [
                    "authenticated",
                    "subscriber"
                ]
                , "days" => "38"
            ]
        ]
    )->makePartial();

 $this->get('/api/v1/exampledl?uid=1&n_id=400&u_ip=104.58.1.45&dl_id=a81498a9')
  ->assertStatus(200)
  ->assertSee('links');

  $this->assertDatabaseHas('users', [
   'uid'               => (int)request('uid'),
   'subscription.role' => 'administrator',
 ]);
}

Я создал для каждого вызова API метод, а затем издевался над ними с помощью Mockery в массиве.

Ответ принят как подходящий

Другой способ имитировать функции одну за другой:

$mock = Mockery::mock(DownloadController::class)->makePartial();
     $mock->shouldReceive('et_download_links_from_download_server')->andReturn('123465');
       $this->app->instance(DownloadController::class,$mock);

Это был такой хороший способ сделать частичное. кажется, это не работает для статических методов.

Mahmood Afzalzadeh 05.07.2020 14:32

Другие вопросы по теме