2014-01-22 62 views
1

我有一些代碼,我通過使用php cli和phpunit的正常文件運行。爲什麼使用php-cli運行一段代碼時會引發警告,但在使用PHPUnit運行完全相同的代碼時不會引發警告?

讓我感到困惑的是,代碼應該在執行過程中發出警告,但它從不會在PHPUnit中引發警告。

這是代碼,當使用php run.php將拋出一個警告運行:

<?php 
error_reporting(E_ALL); 

include 'vendor/autoload.php'; 

$html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 

<style type="text/css"> 

a:active { 
    font-size: 11px; 
} 

</style> 

</head> 
<body> 
    <a href="google.com">blah</a> 
</body> 
</html>'; 

$htmldoc = new InlineStyle\InlineStyle($html); 
$htmldoc->applyStylesheet($htmldoc->extractStylesheets()); //Causes a warning 

echo($htmldoc->getHTML()); 

警告:

Warning: array_map(): An error occurred while invoking the map callback in /work/inlinecss-test/vendor/symfony/css-selector/Symfony/Component/CssSelector/XPath/Translator.php 

如果我通過php-fpmphp運行該文件不要緊,會發出警告。

但是,如果我把代碼放到一個PHPUnit的測試用例,並運行它,沒有警告被拋出:

<?php 
use InlineStyle\InlineStyle; 

class InlineStyleTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testActivePseudoSelectors(){ 
     error_reporting(E_ALL); 
     $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<style type="text/css"> 

a:active { 
    font-size: 11px; 
} 

</style> 

</head> 
<body> 
    <a href="google.com">blah</a> 
</body> 
</html>'; 

     $htmldoc = new InlineStyle($html); 
     $styles = $htmldoc->extractStylesheets(); 

     $htmldoc->applyStylesheet($styles); 


     echo($htmldoc->getHTML()); 
    } 
} 

在這種情況下,測試是罰款,沒有警告被拋出:

OK (1 test, 0 assertions) 

這是我phpunit.xml

<?xml version="1.0" encoding="UTF-8"?> 

<phpunit backupGlobals="false" 
     backupStaticAttributes="false" 
     colors="true" 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     processIsolation="false" 
     stopOnFailure="false" 
     syntaxCheck="false" 
     bootstrap="vendor/autoload.php" 
> 
    <testsuites> 
     <testsuite name="tests"> 
      <directory>tests</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

可能是什麼這種差異的原因?

的代碼在此回購:https://github.com/F21/inlinecss-test

上面運行的結果是特拉維斯-CI:https://travis-ci.org/F21/inlinecss-test/jobs/17397488

+0

我相信PHPUnit的強制所有的警告被關閉,所以他們只能在日誌中。 –

+0

@StevenScott在我的配置中,我已經設置了它,使'convertWarningsToExceptions = true'。嗯。 – F21

+0

這可能是由於您如何嘗試運行它。 PHPUnit使用自己的內部邏輯和Globals的處理,也許這會停止error_reporting(),但我認爲你應該看到基於你的引導的異常。也許在測試文件中嘗試一些簡單的代碼(require/include)? –

回答

-1

PHPUnit的錯誤/警告/通知轉換爲例外,使他們能夠在顯示檢測結果。

PHPUnit Docs

+0

這是真的。但是,如果警告被拋出,然後轉換爲異常,它應該顯示,因爲我沒有捕獲它。例如,如果我使用'trigger_error()'觸發了一個警告,它就會顯示出來並運行測試。 – F21

相關問題