如何在不同情况下测试和模拟枪口反应?

时间:2019-01-29 15:43:52

标签: laravel laravel-5 phpunit guzzle

我想使用来自其他服务的一些疯狂请求来测试我的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 :(得分:3)

我得到了答案。 要在不同情况下模拟函数,只需要使用return User.query.filter_by(email == data['email']).options(db.joinedload('device')).all() $mock = \Mockery::mock 像这样,它使我们可以在不执行功能的情况下获得所需的每笔回报:

makePartial();

我为每个API调用方法创建了一个方法,然后在数组中使用Mockery模拟了它们。

答案 1 :(得分:3)

另一种模拟函数的方式:

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