Как проверить и смоделировать реакции на жадность в разных ситуациях? - PullRequest
0 голосов
/ 29 января 2019

Я хочу проверить мой контроллер 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',
    ]);
    }
    

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

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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

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

$mock = Mockery::mock(DownloadController::class)->makePartial();
     $mock->shouldReceive('et_download_links_from_download_server')->andReturn('123465');
       $this->app->instance(DownloadController::class,$mock);
0 голосов
/ 04 февраля 2019

Я получил ответ.для манипулирования функцией в различных ситуациях ей просто нужно использовать $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 в массиве.

...