2011-12-07 77 views
16

当使用PHPUnit进行单元测试时,如果有任何警告出现在代码中,测试脚本将不会执行该功能,任何人都可以告诉我如何忽略警告并继续测试忽略PHPUnit中的PHP警告

+10

在我看来,单元测试工作,它应。修复代码,使其不会引发警告或错误。 – JJJ

+0

@Juhana:我只需要返回与警告无关的函数的值。正在测试的函数工作正常。 –

+1

在团队工作环境中,您有时必须测试自己的软件包,而且您没有时间/凭据/任务来清理其他软件包(可能会因为它们甚至未被调用而存在警告),因此“修复代码“评论似乎不相关,当你只是想测试一个特定的功能。 – Xmanoux

回答

28

由于Juhana评论说,您应该首先将您的代码修复到出现警告的位置。这是一个标志,代码不能正常/严格地工作。

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

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

要禁用默认行为,可以告诉PHPUnit在测试中这样做,例如,

# 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> 

这些测试的setUp或通过在全局命名空间中设置一个静态变量测试本身内三个选项不可用作命令行开关。

查看相关问题:test the return value of a method that triggers an error with PHPUnit

+0

谢谢你使用“#notice,strict: PHPUnit_Framework_Error_Notice :: $ enabled = FALSE; ” –

+2

我试图用vfsStream来测试一些文件操作。禁用PHP_Unit异常无效(因为某些不支持的chmod()需要)。我必须毕竟使用好的老沉默运算符'@'。 – Zap

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; 
     } 
     // ... 
    } 
}