【问题标题】:Symfony and PHPUnit: Exception thrown but not intercepted by setExpectedExceptionSymfony 和 PHPUnit:抛出异常但未被 setExpectedException 拦截
【发布时间】:2015-08-29 12:07:45
【问题描述】:

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

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

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 错误,报告确切的消息“未提交数据”。更何况,对状态码的assertEquals测试是成功的,所以毫无疑问是正确抛出了异常。

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

知道为什么会这样吗?

【问题讨论】:

  • 你能 c/p phpunit 命令的确切输出吗?另外,您可以尝试testExceptionHasRightMessage 之类的方法来确保整个 phpunit 工作正常吗?

标签: php symfony phpunit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多