我目前正在使用异常处理程序,并创建自己的自定义异常。
我一直在使用PHPUnit在我的Controller资源上运行测试,但是当我抛出自定义异常时,Laravel认为它来自普通的HTTP请求,而不是AJAX。
异常会返回不同的响应,因为它是否是一个AJAX请求,如下所示:
<?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';
}
ExceptionTrait 如下:
<?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);
}
}
最后,我的测试就像这样(测试的摘录失败了)
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'));
}
我的逻辑就像这个虽然我不认为错误来自这里
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;
}
运行PHPUnit时,我返回的错误是
1)CastingsTest :: testApplyToCasting PHPUnit_Framework_Exception: PHPUnit_Framework_Assert的参数#2(无值): :assertArrayHasKey()必须是数组或ArrayAccess
/家庭/流浪/代码/ actuame2 /供应商/ laravel /框架/ SRC /照亮/基金会/ T esting /问题/ MakesHttpRequests.php:304 /home/vagrant/Code/actuame2/tests/CastingsTest.php:105
我的laravel.log就在这里http://pastebin.com/ZuaRaxkL (粘贴太大)
我实际上发现PHPUnit实际上并没有发送AJAX响应,因为我的ExceptionTrait实际上改变了对此的响应。运行测试时,它会将请求作为常规POST请求,并运行 redirect()响应,而不是 ajax(),因此它不会返回对应。
非常感谢!
答案 0 :(得分:0)
我终于找到了解决方案!
正如我所说,回复并不正确,因为它试图重定向rathen而不是返回有效的JSON响应。
在查看了Request代码后,我发现我还需要使用 wantsJson(),因为 ajax()可能并非总是如此,所以我修改了我的特性:
<?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);
}
}