2016-07-29 6 views
0

Ich spiele derzeit mit Exception Handler und meine eigenen benutzerdefinierten Ausnahmen erstellen.Umgang mit benutzerdefinierten Ausnahmen von PHPUnit (Laravel 5.2)

Ich habe PHPUnit verwendet, um Tests auf meiner Controller-Ressource auszuführen, aber wenn ich meine benutzerdefinierten Ausnahmen werfe, denkt Laravel, dass es von einer normalen HTTP-Anfrage als von AJAX kommt.

Ausnahmen zurückgeben andere Antwort basierend auf, ob es ein AJAX-Request oder nicht, wie die folgenden:

<?php namespace Actuame\Exceptions\Castings; 

use Illuminate\Http\Request; 

use Exception; 

use Actuame\Exceptions\ExceptionTrait; 

class Already_Applied extends Exception 
{ 

    use ExceptionTrait; 

    var $redirect = '/castings'; 
    var $message = 'castings.errors.already_applied'; 

} 

Und die ExceptionTrait geht wie folgt:

<?php 

namespace Actuame\Exceptions; 

trait ExceptionTrait 
{ 

    public function response(Request $request) 
    { 
     $type = $request->ajax() ? 'ajax' : 'redirect'; 

     return $this->$type($request); 
    } 

    private function ajax(Request $request) 
    { 
     return response()->json(array('message' => $this->message), 404); 
    } 

    private function redirect(Request $request) 
    { 
     return redirect($this->redirect)->with('error', $this->message); 
    } 

} 

Schließlich geht mein Test wie dieser (Auszug des Tests, der versagt)

public function testApplyToCasting() 
{ 
    $faker = Factory::create(); 

    $user = factory(User::class)->create(); 

    $this->be($user); 

    $casting = factory(Casting::class)->create(); 

    $this->json('post', '/castings/apply/' . $casting->id, array('message' => $faker->text(200))) 
     ->seeJsonStructure(array('message')); 
} 

Meine Logik ist wie diese obwohl ich nicht glaube, der Fehler sich von hier der Fehler, den ich zurück kommt

public function apply(Request $request, User $user) 
{ 
    if($this->hasApplicant($user)) 
     throw new Already_Applied; 

    $this->get()->applicants()->attach($user, array('message' => $request->message)); 

    event(new User_Applied_To_Casting($this->get(), $user)); 

    return $this; 
} 

Wenn PHPUnit läuft, erhalten

1) CastingsTest ist :: testApplyToCasting PHPUnit_Framework_Exception: Argument # 2 (kein Wert) von PHPUnit_Framework_Assert: : assertArrayHasKey() muss ein Array sein oder Arrayaccess

/home/vagrant/Code/actuame2/Hersteller/Laravel/Framework/src/Illuminate/Gründung/T esting/Bedenken/MakesHttpRequests.php: 304 /home/vagrant/Code/actuame2/tests/CastingsTest.php:105

Und mein laravel.log ist hier http://pastebin.com/ZuaRaxkL(zu groß, um zu Paste)

ich habe tatsächlich entdeckt, dass PHPUnit ist eigentlich nicht ein AJAX-Antwort senden, weil meine ExceptionTrait tatsächlich die Antwort auf diese Änderungen . Beim Ausführen des Tests nimmt es die Anfrage als eine normale POST-Anfrage und führt die redirect() Antwort statt ajax(), daher gibt es nicht die entsprechenden zurück.

Vielen Dank!

Antwort

0

Ich habe endlich die Lösung gefunden!

Wie gesagt, die Antwort war nicht die richtige, da sie versuchte, rathen umzuleiten, als eine gültige JSON-Antwort zurückzugeben.

Und nach dem Request-Code durchlaufen, fand ich heraus, dass ich auch wantsJson(), als Ajax() der Fall sein kann nicht immer verwenden müssen, so habe ich meine Eigenschaft zu dieser Änderung:

<?php 

namespace Actuame\Exceptions; 

trait ExceptionTrait 
{ 

    public function response(Request $request) 
    { 
     // Below here, I added $request->wantsJson() 
     $type = $request->ajax() || $request->wantsJson() ? 'ajax' : 'redirect'; 

     return $this->$type($request); 
    } 

    private function ajax(Request $request) 
    { 
     return response()->json(array('message' => $this->message), 404); 
    } 

    private function redirect(Request $request) 
    { 
     return redirect($this->redirect)->with('error', $this->message); 
    } 

}