有人向我的一个库提交了一个拉取请求,其中通过将function doSomething($var)
之类的内容替换为function doSomething($var = 'whatever')
使参数成为可选参数。
因此,我添加了一个单元测试,以确保如果没有将足够的变量传递给该方法,则将发出错误。为了解决这个问题,我使用了PHPUnit注释@expectedException
。对于PHP 7.0,预期的例外是PHPUnit_Framework_Error_Warning
,而对于PHP 7.1+,预期的例外是ArgumentCountError
。这提出了一个小问题。我可以使测试通过PHP 7.0和更低版本,或者通过PHP 7.1和更高版本。我不能让他们都支持。
另一个PHPUnit注释是@requires
,但似乎只允许您将测试限制为最低PHP版本-而不是最高PHP版本。例如。如果执行@requires PHP 7.1
,则意味着PHP 7.1是运行测试所需的最低PHP版本,但无法使PHP 7.0成为运行测试的最高版本。
我以为执行@expectedException Exception
会起作用(因为大概PHPUnit_Framework_Error_Warning
和ArgumentCountError
都扩展了Exception,但是似乎也不是这样。
如果我可以做类似@expectedException PHPUnit_Framework_Error_Warning|ArgumentCountError
的事情,那将很酷,但是PHPUnit文档中的任何内容都不会让我相信我可以,而https://github.com/sebastianbergmann/phpunit/issues/2216则使我觉得那是无法完成的。
也许我应该一起删除这个特定的单元测试?
最佳答案
您可以使用expectException()
方法调用,而不是@expectedException
批注。使用方法调用is recommended anyway。
测试中的条件测试通常不是一个好主意,因为测试应该很简单,但是如果您坚持要执行以下操作:
public function testIt()
{
if (PHP_VERSION_ID >= 70100) {
$this->expectException(ArgumentCountError::class);
} else {
$this->expectException(PHPUnit_Framework_Error_Warning::class);
}
// ...
}
您还可以实现两个单独的测试用例,并根据PHP版本跳过一个或另一个:
public function testItForPHP70()
{
if (PHP_VERSION_ID >= 70100) {
$this->markTestSkipped('PHPUnit_Framework_Error_Warning exception is thrown for legacy PHP versions only');
}
$this->expectException(PHPUnit_Framework_Error_Warning::class);
// ...
}
public function testItForPHP71AndUp()
{
if (PHP_VERSION_ID < 70100) {
$this->markTestSkipped('ArgumentCountError exception is thrown for latest PHP versions only');
}
$this->expectException(ArgumentCountError::class);
// ...
}
关于php - 捕获ArgumentCountError和PHPUnit_Framework_Error_Warning,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48189512/