从PHPUnit处理自定义异常(Laravel 5.2)

时间:2016-07-29 15:32:50

标签: laravel phpunit laravel-5.2

我目前正在使用异常处理程序,并创建自己的自定义异常。

我一直在使用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(),因此它不会返回对应。

非常感谢!

1 个答案:

答案 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);
    }

}