gpt4 book ai didi

php - 捕获 ArgumentCountError 和 PHPUnit_Framework_Error_Warning

转载 作者:行者123 更新时间:2023-12-03 19:35:55 24 4
gpt4 key购买 nike

有人向我的库提交了一个拉取请求,其中一个参数是可选的,方法是将 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_WarningArgumentCountError 都扩展了 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com