【问题标题】:Symfony server ignores catch block in unittestSymfony 服务器忽略单元测试中的 catch 块
【发布时间】:2017-04-26 01:15:33
【问题描述】:

目前我用 phpunit 为我的 symfony 项目编写了一些测试。

我想测试服务器是否正确处理了一个特殊问题。 服务器尝试将邮件添加到组。但该组不存在。所以 ldap_mod_add 抛出异常。在代码中,我捕获了异常并创建了组,以便可以将邮件添加到其中。

如果我在没有 phpunit 的情况下尝试代码,它可以正常工作。但是使用 phpunit,服务器会忽略 catch 块。

功能如下

//Add
try
{
    ldap_mod_add($this->ldapCon,"mail=$forward,$ldaptree",$forward_info);
}
catch (ContextErrorException $e)
{
    //Check if the forward exist
    $forwardGroup = $this->getForwardForMail($forward);
    if($forwardGroup == [])
    {
        $this->logger->addAlert("Forward $forward does not exist");
        $this->session->getFlashBag()->add("notice","We added the group $forward, because it did not exist.");
        //Create forward and add the first mail
        $this->createForward($forward,$mail);
        return;
    }
    throw new AllreadyInGroupException("User already in forward $forward");
}

我禁用了 convertWarningsToExceptions 选项,这样即使 php 由于组不存在而发出警告,测试也会继续进行。

那么为什么服务器会忽略 phpunit 的 catch 块呢?

感谢您的帮助

【问题讨论】:

    标签: php ldap phpunit symfony


    【解决方案1】:

    检查被抛出异常的实际类。

    仅当 ErrorHandler 处于活动状态时,Symfony 才会抛出 ContextErrorException,这在 PHPUnit 运行的单元测试中可能并非如此。

    尝试改用\ErrorException

    我会启用convertWarningsToExceptions 以保持一致的行为。没有它,您的转发逻辑将无法在测试中运行(如果仅发出普通的 PHP 警告,则 catch 块将不会运行)。

    【讨论】:

    • 我试图替换 catch 块参数。但这无济于事。但我知道为什么。 ldap_mod_add 不会引发异常。它只会返回 false 并创建警告。例外仅来自 Symfony。但是最好的解决方案是什么?我应该使用 if 块和 catch 块来捕获错误和异常吗?或者我可以在 Symfony 中禁用异常警告吗?
    • 它只返回 false - 因为你禁用了 convertWarningsToExceptions
    猜你喜欢
    • 2019-04-13
    • 2023-04-08
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多