Symfony和PHPUnit:异常抛出但未被setExpectedException截获

时间:2015-06-13 16:04:49

标签: php symfony phpunit

我为控制器编写了一个测试,该控制器在数据库中保存了表单传递的一些数据。

我编写了以下测试方法,以确保如果表单为空,则抛出异常:

public function testRegisterNewMerchantExceptionNoDataSubmitted()
{
    $client = static::createClient();
    $crawler = $client->request('GET', '/getstarted');

    $form = $crawler->selectButton('getStarted[submit]')->form();
    $form['getStarted[email]'] = '';

    $this->setExpectedException('DomainException');
    $client->submit($form);

    $this->assertEquals(500, $client->getResponse()->getStatusCode());

    //dump($client->getResponse());die;
}

我正在测试的方法如下:

public function endAction(Request $request)
{
    $form = $this->createForm(new GetStartedType());

    $form->handleRequest($request);

    if ($form->isValid()) {
        // Get data from form
        $data = $form->getData();
    } else {
        throw new  \DomainException('No data submitted.');
    }

    ...

我确信在测试期间也会抛出异常,因为转储Response对象页面是500错误,报告确切消息“No data submitted”。更多,对状态代码的assertEquals测试是成功的,因此毫无疑问是否正确抛出异常。

但是$this->setExpectedException()测试不会拦截它并返回测试失败。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

使用$this->setExcpectedException()告诉PHPUnit期望从测试方法中抛出给定的异常类型,而不仅仅是在执行期间的某个时刻抛出了该类型的异常。

当您在控制器方法中抛出异常时,Symfony控制器会捕获 该异常并创建500响应。这意味着不会从测试方法抛出异常,因此测试失败。否则,您的测试看起来很合理,因此删除$this->setExpectedException()可以解决问题并测试您想要的行为。