PHPUnit测试Laravel资源控制器的异常

3

使用Laravel资源控制器测试异常是否可行?每次我尝试执行以下操作:

/**
 * @expectedException Exception
 * @expectedExceptionMessage Just testing this out
 */
public function testMyPost() {
    $response = $this->call('POST', '/api/myapi/', array('testing' => 1));
}

I get:

Failed asserting that exception of type "Exception" is thrown.

我已经尝试过使用 \ExceptionException

在我的资源控制器中,我有:

public function store() {
    throw new \Exception('Just for testing!');
}

有没有人知道如何测试异常?我也尝试使用:

    $this->setExpectedException('InvalidArgumentException');

如果您将其指定为 @expectedException \\Exception 会怎样? - zerkms
相同的 :( 断言未抛出类型为 "\Exception" 的异常。 - mayrop
如果您使用 try-catch 包装您的调用,并使用 get_class($e) 获取确切的异常类型,会怎样呢?可能是 $this->call() 抛出了一个异常,而您原始的异常被其他东西处理了。 - zerkms
即使我调用$response = $this->action('POST', 'APIController@store');,也没有抛出任何东西。 - mayrop
很奇怪,即使我从全局文件中删除了App::error(用于测试),我仍然没有收到异常,哦好吧。 - mayrop
显示剩余2条评论
2个回答

9
问题就像hannesvdvreken所说的那样,异常已经被捕获。一个简单的解决方法是告诉Laravel错误/异常处理程序,在测试时我们只想抛出异常。代码可能如下所示:
    // If we are testing, just throw the exception.
    if (App::environment() == 'testing') {
        throw $e;
    }

对于Laravel 5,这应该放在app/Exceptions/Handler.php的render方法中。

对于Laravel 4,这应该放在app/start/global.php中:

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

1
不要过多关注@expectedException的表示法,问题在于某处捕获了异常。可能是由于app/start/global.php文件中默认的App::error(function(Exception) {...,也可能是你在某处使用了try catch。尝试创建一个自定义异常,不要被捕获所有继承自异常的通用异常捕获器所捕获。

我会尝试使用自定义异常并让您知道结果。但是,最终我仍需要捕获异常以避免应用程序崩溃,但如果这样做,单元测试就无法正常运行 :( - mayrop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接