【问题标题】:PHPUnit - Invalid argument supplied for foreach() not recognized despite expecting itPHPUnit - 为 foreach() 提供的无效参数无法识别,尽管期望它
【发布时间】:2019-10-03 16:06:12
【问题描述】:

所有...我的主题说明了一切。我正在尝试做一个实际上故意使“foreach() 提供的参数无效”发生的测试。我试图让 PHPUnit expect 它,但是......不,我的测试仍然戛然而止。原因:“为 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。

【问题讨论】:

  • 不清楚你在问什么。测试期望 $resp = $barabajagal->add(); 抛出 InvalidArgumentException。你说的“急刹车”是什么意思?有错误吗?你期望会发生什么?没有足够的信息来调试问题所在。
  • PHPunit 返回错误。所有断言(但不包括)都发生了,我从 PHPunit 收到一条消息,说“有 1 个错误:1) flirzelkwerpTest::testAdd / 为 foreach() 提供的参数无效” --- 我认为期待一个错误的全部意义在于 PHPUnit 不会在它上面胡扯,不是吗?重点是我希望 PHPUnit 注意到该错误即将出现,期待它,并继续进行剩余的测试——它没有。我不知道您还需要什么其他信息。
  • 我认为您可能启用了--stop-on-failure--stop-on-error 等标志之一,请参阅phpunit.readthedocs.io/en/8.3/textui.html。另请参阅stopOnFailurestopOnError 等配置选项phpunit.readthedocs.io/en/8.3/configuration.html
  • 好电话——让我检查一下。谢谢!
  • 您希望代码$barabajagal->add(); 会发出警告,就像我提供的代码一样,但显然它并没有按照您的预期执行。测试没有问题。问题是:$barabajagal->add();。它没有做你期望它做的事情。 测试实际上在您的代码中发现了一个错误。

标签: phpunit invalidargumentexception


【解决方案1】:

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

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

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

——Testing PHP Errors

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

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

——Testing PHP Errors

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) {}
    }
}

【讨论】:

猜你喜欢
  • 2016-10-09
  • 2011-05-17
  • 2011-02-07
相关资源
最近更新 更多