【问题标题】:Ignoring the PHP warnings in PHPUnit忽略 PHPUnit 中的 PHP 警告
【发布时间】:2012-01-14 19:30:12
【问题描述】:

当代码中出现任何警告时,我正在使用 PHPUnit 对我的函数进行单元测试,测试脚本将不会针对该函数执行,谁能告诉我如何忽略警告并继续测试

【问题讨论】:

  • 在我看来,单元测试工作正常。修复代码,使其不会引发警告或错误。
  • @Juhana:我只需要返回与警告无关的函数的值。正在测试的函数工作正常。
  • 在团队工作环境中,您有时只需要测试自己的捆绑包,而您没有时间/凭证/任务来清理其他捆绑包(这可能会因为它们存在甚至不存在而引发警告调用),因此当您只想测试特定功能时,“修复代码”注释似乎无关紧要。

标签: php unit-testing phpunit


【解决方案1】:

正如 Juhana 所说,您应该首先修复出现警告的代码。这表明代码无法正常/严格运行。

默认情况下,PHPUnit 会将测试执行期间触发的 PHP 错误、警告和通知转换为异常。

请参阅Testing PHP Errors,其中包含有关如何测试警告(以及如何忽略您在测试中调用的子例程中的警告)的更多信息。

要禁用默认行为,您可以在测试中告诉 PHPUnit 这样做,例如通过在全局命名空间中设置静态变量,在您的测试或测试本身的 setUp 内:

# Warning:
PHPUnit_Framework_Error_Warning::$enabled = FALSE;

# notice, strict:
PHPUnit_Framework_Error_Notice::$enabled = FALSE;

更改默认行为的另一个选项是configure the testrunner with an XML file,设置如下:

<phpunit convertErrorsToExceptions="false"
         convertNoticesToExceptions="false"
         convertWarningsToExceptions="false">
</phpunit>

这三个选项不能用作命令行开关。

请参阅相关问题:test the return value of a method that triggers an error with PHPUnit

【讨论】:

  • 感谢它与“# notice, strict: PHPUnit_Framework_Error_Notice::$enabled = FALSE;”一起使用
  • 我尝试使用它来测试一些使用 vfsStream 的文件操作。禁用 PHP_Unit 异常不起作用(由于某些不支持的 chmod() 需要)。毕竟我必须使用好的旧静音运算符'@'。
【解决方案2】:

在每个测试级别执行此操作的文档化策略是在您的测试调用会触发警告或通知的函数时使用@ 错误抑制运算符。

以下代码是来自PHPUnit documentation的示例:

<?php
class ErrorSuppressionTest extends PHPUnit_Framework_TestCase
{
    public function testFileWriting() {
        $writer = new FileWriter;
        $this->assertFalse(@$writer->write('/is-not-writeable/file', 'stuff'));
    }
}
class FileWriter
{
    public function write($file, $content) {
        $file = fopen($file, 'w');
        if($file == false) {
            return false;
        }
        // ...
    }
}

【讨论】:

    【解决方案3】:

    您不应该忽略警告,它们的存在是有原因的。话虽如此,警告和通知并不是要致命的(如果它们是致命的,它们就会是一个错误)。

    您应该在单元测试中对其进行测试,而不是忽略该警告。你可以通过使用Netsilik/BaseTestCase(MIT 许可证)来做到这一点。通过这个 PHPUnit 扩展,您可以直接测试触发的错误/警告,而无需将它们转换为异常:

    composer require netsilik/base-test-case


    测试E_USER_NOTICE

    <?php
    namespace Tests;
    
    class MyTestCase extends \Netsilik\Testing\BaseTestCase
    {
        /**
         * {@inheritDoc}
         */
        public function __construct($name = null, array $data = [], $dataName = '')
        {
            parent::__construct($name, $data, $dataName);
    
            $this->_convertNoticesToExceptions  = false;
            $this->_convertWarningsToExceptions = false;
            $this->_convertErrorsToExceptions   = true;
        }
    
        public function test_whenNoticeTriggered_weCanTestForIt()
        {
            $foo = new Foo();
            $foo->bar();
    
            self::assertErrorTriggered(E_USER_NOTICE, 'The warning string');
        }
    }
    

    希望这对将来的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2021-05-23
      • 2015-03-10
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多