无法使用Laravel中的App :: error定义测试代码

时间:2014-09-25 11:39:42

标签: php exception testing laravel phpunit

我遇到了测试Laravel应用程序的问题,这些应用程序会抛出由global.php中的App :: errors声明处理的异常。当我在本地环境中使用curl向控制器执行请求时,一切都按预期工作,但是当在单元测试中与客户端执行相同的请求时,异常将返回而不是被app :: error定义捕获。我在一个半大型的laravel应用程序中发现了这个问题,但我可以用新生成的Laravel项目复制行为。

在我唯一的控制器中,我抛出了这样的异常:

throw new Exception("My test exception");

app :: error声明如下所示:

App::error(function(Exception $exception, $code) {

    Log::error($exception);
    return Response::make("YAY from app:error!", 500);
});

运行时遇到的错误是:

PHPUnit 4.2.6 by Sebastian Bergmann.

Configuration read from /Users/foo/testapp/testapp/phpunit.xml

E

Time: 64 ms, Memory: 9.75Mb

There was 1 error:

1) ExampleTest::testBasicExample
Exception: My test exception

/Users/foo/testapp/testapp/app/controllers/TestController.php:23
/Users/foo/testapp/testapp/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:231
/Users/foo/testapp/testapp/bootstrap/compiled.php:5799
/Users/foo/testapp/testapp/bootstrap/compiled.php:5787
/Users/foo/testapp/testapp/bootstrap/compiled.php:4986
/Users/foo/testapp/testapp/bootstrap/compiled.php:5345
/Users/foo/testapp/testapp/bootstrap/compiled.php:5011
/Users/foo/testapp/testapp/bootstrap/compiled.php:4999
/Users/foo/testapp/testapp/bootstrap/compiled.php:722
/Users/foo/testapp/testapp/bootstrap/compiled.php:703
/Users/foo/testapp/testapp/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php:81
/Users/foo/testapp/testapp/vendor/symfony/browser-kit/Symfony/Component/BrowserKit/Client.php:327
/Users/foo/testapp/testapp/vendor/laravel/framework/src/Illuminate/Foundation/Testing/ApplicationTrait.php:51
/Users/foo/testapp/testapp/app/tests/ExampleTest.php:12

我添加到默认TestCase.php的唯一代码是:

/**
 * Default preparation for each test
 */
public function setUp() {
    parent::setUp();
    Route::enableFilters();
}

唯一测试中的唯一代码:

$this->call('GET', 'test'); // test is the only route existing in this app

版本:

  • Laravel(框架):4.2.9
  • PHPUnit:4.2.6
  • PHP:5.5.15操作系统:
  • OSX 10.9.3

有人知道如何解决这个问题所以App:错误实际上是在测试时被触发了吗?或者我在抛出和捕获异常的方式上做错了什么?

1 个答案:

答案 0 :(得分:2)

自从你提出这个问题已经有一段时间了,但希望这有助于有人寻找答案:

见Taylor Otwell的comment on this。转载如下:

“从查看PHPUnit源代码来看,它们会捕获异常并吞噬它们,因此您的处理程序不会被捕获。

但是,我认为这可以通过解耦你的测试来解决。你真的想测试处理程序,并且异常完全单独抛出以隔离你的测试。例如:

App::error(function(ErrorType $e)
{
    App::make('ErrorTypeHandler')->handle($e);
});

现在,您可以将ErrorTypeHandler类的测试用例与应用程序的其余部分分开编写。然后检查您的应用程序是否使用@expectedException抛出了正确的异常。“

简单地说,如果要测试它们,请单独实现您的Exception处理程序。