PHPUnit-为foreach()提供的无效参数无法识别,尽管需要它

PHPUnit-为foreach()提供的无效参数无法识别,尽管需要它,phpunit,invalidargumentexception,Phpunit,Invalidargumentexception,我的主题说明了一切。我试图做一个测试,实际上是故意让foreach提供的无效参数发生。我试着让PHPUnit期待它,但是…不,我的测试仍然会突然停止。原因:为foreach right提供的参数在我告诉它将要发生的确切位置无效 在我的文件顶部,我有: use PHPUnit\Framework\TestCase; use PHPUnit\Framework\Error\Error; use PHPUnit\Framework\Error\Notice; use PHPUnit\Framework

我的主题说明了一切。我试图做一个测试,实际上是故意让foreach提供的无效参数发生。我试着让PHPUnit期待它,但是…不,我的测试仍然会突然停止。原因:为foreach right提供的参数在我告诉它将要发生的确切位置无效

在我的文件顶部,我有:

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,嘿,bub,我想这里会有一个错误,这就是你应该得到的信息吗

我们正在使用PHP7.3.4和PHPUnit 8.3.2。

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

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

-

2确保设置了PHP的错误报告 PHP的运行时配置可以限制PHPUnit将哪些错误转换为异常。如果您对此功能有问题,请确保未将PHP配置为抑制正在测试的错误类型

-

3使用PHPUnit提供的转换异常 当有三件事需要注意时,1确保PHPUnit将PHP错误、警告和通知转换为异常,1确保PHP的错误报告设置正确,3使用PHPUnit将错误、警告和通知转换为的异常

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

-

2确保设置了PHP的错误报告 PHP的运行时配置可以限制PHPUnit将哪些错误转换为异常。如果您对此功能有问题,请确保未将PHP配置为抑制正在测试的错误类型

-

3使用PHPUnit提供的转换异常
你不清楚你在问什么。测试期望$resp=$barabajagal->add;引发InvalidArgumentException;。你所说的尖叫声是什么意思?有错误吗?你预计会发生什么?没有足够的信息来调试任何问题。PHPunit返回一个错误。直到(但不包括)这一次的所有断言都会发生,我从PHPunit收到一条消息,说有1个错误:1个flirzelkwertest::testAdd/为foreach提供的无效参数-我认为预期错误的全部意义在于PHPunit不会在上面浪费时间,不是吗?关键是我想让PHPUnit注意到错误正在出现,期待它,并继续进行剩余的测试——它没有这样做。我不知道您还需要什么其他信息。我想您可能启用了-stop on failure、-stop on error等标志之一。请参阅。还可以查看配置选项,如stopOnFailure、stopOnError等良好调用-让我检查一下。谢谢您需要代码$barabajagal->add;提出一个警告,就像我提供的代码一样,但显然它没有达到您期望的效果。这次考试没有问题。问题是:$barabajagal->add;。它没有做你期望它做的事。测试实际上在你的代码中发现了一个bug。不清楚你在问什么。测试期望$resp=$barabajagal->add;引发InvalidArgumentException;。你所说的尖叫声是什么意思?有错误吗?你预计会发生什么?没有足够的信息来调试任何问题。PHPunit返回一个错误。直到(但不包括)这一次的所有断言都会发生,我从PHPunit收到一条消息,说有1个错误:1个flirzelkwertest::testAdd/为foreach提供的无效参数-我认为预期错误的全部意义在于PHPunit不会在上面浪费时间,不是吗?关键是我想让PHPUnit注意到错误正在出现,期待它,并继续进行剩余的测试——它没有这样做。我不知道您还需要什么其他信息。我想您可能启用了-stop on failure、-stop on error等标志之一。请参阅。还可以查看配置选项,如stopOnFailure、stopOnError等良好调用-让我检查一下。谢谢您需要代码$barabajagal->add;淋雨
这是一个警告,就像我提供的代码一样,但显然它没有达到您期望的效果。这次考试没有问题。问题是:$barabajagal->add;。它没有做你期望它做的事。测试实际上在你的代码中发现了一个bug。谢谢你的帮助,Gerard!从PHPUnit 8.4开始,您希望使用。感谢您的帮助,Gerard!从PHPUnit 8.4开始,您希望使用。
<?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) {}
    }
}