PHPUnit 使用注解断言异常与方法调用
PHPUnit using annotations to assert exception vs method call
在 Phpunit 中有两种断言异常的方法:
- 使用注解
@expectedException
- 使用方法调用
$this->expectException()
两种我都试过了,效果很好,完全一样。
哪个是正确的方法?
是否有关于应使用哪一种的指南?
PS:当异常是基于某些条件并且并不总是发生时,显然应该使用该方法。
为什么我选择使用方法而不是注释对我来说有一些明显的优势。
在注释形式中,您必须使用完整的命名空间到 class 名称才能工作:
@expectedException MyException // Not found unless it is within the current namespace
@expectedException \Some\Deep\Namespace\MyException // works
备选方案:
$this->expectException(MyException::class); // works, with a 'use' statement
这更具可读性、更明确、更灵活(自动化 refactoring/renaming 在大多数编辑器如 PHPStorm 中是轻而易举的),编写的代码更少,并且符合标准的测试方法设置顺序正确的 3 个阶段,Arrange、Assert、Act。最后,注释在内部需要被解析,并且无论如何只会调用 expectException 方法。所以它也会更有效率。
使用 expectException()
被认为是最佳实践,请参阅此 article。
在 Phpunit 中有两种断言异常的方法:
- 使用注解
@expectedException
- 使用方法调用
$this->expectException()
两种我都试过了,效果很好,完全一样。
哪个是正确的方法? 是否有关于应使用哪一种的指南?
PS:当异常是基于某些条件并且并不总是发生时,显然应该使用该方法。
为什么我选择使用方法而不是注释对我来说有一些明显的优势。
在注释形式中,您必须使用完整的命名空间到 class 名称才能工作:
@expectedException MyException // Not found unless it is within the current namespace
@expectedException \Some\Deep\Namespace\MyException // works
备选方案:
$this->expectException(MyException::class); // works, with a 'use' statement
这更具可读性、更明确、更灵活(自动化 refactoring/renaming 在大多数编辑器如 PHPStorm 中是轻而易举的),编写的代码更少,并且符合标准的测试方法设置顺序正确的 3 个阶段,Arrange、Assert、Act。最后,注释在内部需要被解析,并且无论如何只会调用 expectException 方法。所以它也会更有效率。
使用 expectException()
被认为是最佳实践,请参阅此 article。