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!