1

一切……我的主题说明了一切。我正在尝试做一个实际上故意使“为foreach()提供的参数无效”发生的测试。我试图让 PHPUnit期待它,但是......不,我的测试仍然戛然而止。原因:“为 foreach() 提供的参数无效”就在我告诉它它会发生的确切位置。

在我的文件顶部,我有:

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Error\Error;
use PHPUnit\Framework\Error\Notice;
use PHPUnit\Framework\Error\Warning;

我的班级声明以:

Class flirzelkwerpTest extends TestCase {

以下是测试文件中的行:

    // Let's try to add nothing.
    // (It should throw an error because of "Invalid argument supplied for foreach()" in barabajagal.php.)
    $this->expectException(\InvalidArgumentException::class);
    $this->expectExceptionMessage('Invalid argument supplied for foreach()');
    $resp = $barabajagal->add();

错误发生在最后一行。前两行不应该告诉 PHPUnit,“嘿,伙计,我希望这里有一个错误,这是你应该逐字收到的消息”?

我们使用的是 PHP 7.3.4 和 PHPUnit 8.3.2。

4

1 回答 1

4

测试 PHP 错误时需要注意三件事 1) 确保 PHPUnit 将 PHP 错误、警告和通知转换为异常,1) 确保正确设置 PHP 的错误报告,以及 3) 使用 PHPUnit 转换错误的异常、警告和通知。

1) 确保 PHPUnit 正在转换错误、警告和通知

默认情况下,PHPUnit 将测试执行期间触发的 PHP 错误、警告和通知转换为异常。例如,使用这些异常,您可以期望测试触发 PHP 错误,如示例 2.12 所示。

测试 PHP 错误

2) 确保设置了 PHP 的错误报告

PHP 的error_reporting运行时配置可以限制 PHPUnit 将哪些错误转换为异常。如果您在使用此功能时遇到问题,请确保未将 PHP 配置为抑制您正在测试的错误类型。

测试 PHP 错误

3)使用PHPUnit提供的转换后的异常

<?php

namespace Sandbox\Stackoverflow;

use PHPUnit\Framework\Error\Warning;

class Q58222995Test extends \PHPUnit\Framework\TestCase
{
    public function testForeachWarning()
    {
        $this->expectException(Warning::class);
        $this->expectExceptionMessage('Invalid argument supplied for foreach()');

        $collection = null;
        foreach ($collection as $value) {}
    }
}
于 2019-10-03T20:16:10.613 回答