【问题标题】:PHPUnit test code inside catch blockcatch 块内的 PHPUnit 测试代码
【发布时间】:2023-04-01 07:04:01
【问题描述】:

我有一个使用 try...catch 的 Symfony 控制器。 我使用 phpunit 来测试我的应用程序。我已经搜索但还没有找到一种方法来测试捕获异常中的代码。如何强制 php 单元假装出错并进入 catch 块并对其进行测试?

即:

 try {
      $foo = 1;
     } catch (\Exception $ex) {
        $mail = new Mail();
        $mail->sendMail();
        return new Response();
    }

我如何告诉 phpunit 抛出一个 \Exception 以便它测试上面的 catch 块中的代码?

【问题讨论】:

  • 如果您的控制器在某些条件下抛出异常,并且您想对其进行测试,只需模拟这些条件即可。
  • 是的,您可以创建代码将创建异常的条件。
  • 你那里有什么代码?在实际应用程序中必须抛出异常的东西。你需要模拟这部分来抛出异常。不过,如果你能把代码给我们看看就好了。

标签: unit-testing symfony testing phpunit functional-testing


【解决方案1】:

好吧,在这些条件下,它显然不会抛出任何异常,但请考虑您的 try/catch 所在的函数。您需要对该函数进行单元测试,并提供会导致它失败的参数并捕获。

例如:

public function doStuff($argument) {
    try {
        $parsed = (int)$argument; //but what if $argument is a string with letters
    } catch (\Exception $ex) {
        //do stuff
    }

测试你搞砸时是否抛出异常:

public function testDoStuff() {
    // get a mock of the class, let's just call it $mock
    // do some regular asserts if you want

    $this->setExpectedException('\Exception');
    $mock->doStuff('haha, you can't parse this');
}

【讨论】:

    【解决方案2】:

    如果您的 catch 块中确实有一些复杂的东西,您可以将其移动到控制器的单独受保护方法并单独测试它。您可以使用反射轻松访问其类之外的受保护方法。

    【讨论】:

    • 请不要这样做。不要测试受保护的方法。这是与实现细节而不是行为细节紧密耦合的方式。这是由于您需要单独测试每个类的错误假设。与其这样做,不如使用 TDD 并只考虑您希望与您的小类捆绑包拥有的合同。您会注意到,当需要重构时,您的测试不再失败。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2021-02-08
    • 2013-10-01
    • 2019-03-07
    相关资源
    最近更新 更多