catch 块内的 PHPUnit 测试代码
Posted
技术标签:
【中文标题】catch 块内的 PHPUnit 测试代码【英文标题】:PHPUnit test code inside catch block 【发布时间】:2016-08-30 14:37:32 【问题描述】:我有一个使用 try...catch 的 Symfony 控制器。 我使用 phpunit 来测试我的应用程序。我已经搜索但还没有找到一种方法来测试捕获异常中的代码。如何强制 php 单元假装出错并进入 catch 块并对其进行测试?
即:
try
$foo = 1;
catch (\Exception $ex)
$mail = new Mail();
$mail->sendMail();
return new Response();
我如何告诉 phpunit 抛出一个 \Exception 以便它测试上面的 catch 块中的代码?
【问题讨论】:
如果您的控制器在某些条件下抛出异常,并且您想对其进行测试,只需模拟这些条件即可。 是的,您可以创建代码将创建异常的条件。 你那里有什么代码?在实际应用程序中必须抛出异常的东西。你需要模拟这部分来抛出异常。不过,如果你能把代码给我们看看就好了。 【参考方案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 并只考虑您希望与您的小类捆绑包拥有的合同。您会注意到,当需要重构时,您的测试不再失败。以上是关于catch 块内的 PHPUnit 测试代码的主要内容,如果未能解决你的问题,请参考以下文章
描述块内的 jest.setTimeOut() 是不是仅将超时应用于描述块内的测试
Laravel 5.5 PHPunit 测试 - “尚未设置外观根。”