2016-03-31 2 views
1

Meine API hatLaravel API-Test - Wie API zu testen, die externe API-Aufruf Code

public function store (Request $request, $profileId) 
{ 
    $all = $request->all(); 
    $token = AccessToken::with('users')->where('access_token',$request->input('access_token'))->first(); 

    if($token && $token->users->isOwnProfile($profileId)) 
    { 
     $rules = [ 
      'access_token'  => 'required', 
      'title'   => 'required', 
      'description'  => 'required', 
      'file_id'   => 'required', 
      'audience_control' => 'required|in:' . join(',', PostRepository::$AUDIENCE_CONTROL), 
      'tags'    => 'required', 
     ]; 
     $validator = Validator::make($all, $rules); 

     $error = $validator->errors()->toArray(); 
     if ($validator->fails()) 
     { 
      return $this->setStatusCode(401) 
       ->setStatusMessage(trans('api.validation failed')) 
       ->respondValidationMessage($error); 
     } 
     try { 
      $response = $this->postRepository->save($request, $profileId); 
      if(isset($response['error'])) 
       return $this->messageSet([ 
        'message' => $response['error']['message'], 
       ], $response['error']['status_code']); 

      return $this->setDataType('post_id') 
       ->setStatusCode('200') 
       ->respondWithCreatedId(trans('api.Post created'), $response->id); 
     } catch (\Exception $e) { 
      return $this->respondInternalError(trans('api.processing error')); 
     } 
    } 
    return $this->respondInternalError('404 page'); 

} 

Von Save-Methode ruft eine andere Methode, die eine externe API-Aufrufe.

/* 
* this function returns some response where it has profile_id for 
* the file which in other save function is matched that the 
* profile_id passed as parameter is same with file profile_id 
*/ 
public function getFileDetails($file_id) 
{ 
    try 
    { 
     $response = json_decode((new Client())->request('GET', env('xyz','http://abc.xyz/api/v1').'/files/' . $file_id)->getBody()->getContents(), true); 
    } 
    catch (RequestException $e) 
    { 
     $response = json_decode($e->getResponse()->getBody()->getContents(), true); 
    } 

    return $response; 

} 

Jetzt ist dies meine Testfunktion für API.

public function testPostCreateChecksProfileMatchesCorrectly() 
{ 
    $this->json('POST', 'profiles/' . $this->getProfile()->id . '/posts' . '?access_token=' . $this->getAccessToken(), [ 
     'title' => 'api testing title', 
     'description' => 'api testing description', 
     'audience_control' => 'public', 
     'tags' => [ 
      'Animals', 
      'City' 
     ], 
     'file_id' => '281' 
    ])->seeJsonStructure([ 
     'success' => [ 
      'message', 
      'post_id', 
      'status', 
     ], 
    ]); 
} 

Jetzt ist meine Frage, wie kann ich eine gefälschte Antwort für den externen API erstellen, wenn ich testen werde.

Ich bin mit PHPUnit & Laravel 5.2.

+0

Related: http://stackoverflow.com/a/36281263/330267 –

Antwort

0

Zuerst testen Sie nie ein Ding, das Sie nicht besitzen. Ein externer API-Aufruf ist ein Gedanke, den Sie nicht besitzen. Es kann zu tausend Problemen oder Anwendungsfällen kommen, die schief gehen könnten, wie das Senden von Daten, der Netzwerkfehler oder der interne Fehler. In jedem Fall sollten Sie die Situation testen, was mühsam ist. Verwenden Sie lieber ein Moc-Objekt und setzen Sie eine gewisse Erwartungshaltung darauf. Hören Sie sich diesen Podcast an, http://www.fullstackradio.com/37, damit Sie das klar verstehen.

Versuchen Sie, Ihren Code in kleine Blöcke zu zerlegen und jeden Block separat zu testen. Sie erwarten zu viel von einem einzigen Test. Fügen Sie Ihre Validierungslogik in eine FormRequest-Klasse ein, dies wird Ihnen sehr helfen.

+0

Ich würde sagen: "Testen Sie nie eine Sache, die Sie nicht besitzen." ist ein schrecklicher Ratschlag. Ich benötige immer eine Reihe von Integrationstests, um sicherzustellen, dass ich korrekt mit der dritten Partei rede. Es ist eine kleine Testsuite, da ich immer eine Abstraktion für die Kommunikation mit Drittparteien einführe, aber sie existiert. Die Abstraktion kann dann verspottet werden (aber nicht die Interaktion mit der dritten Partei). –