2014-03-06 24 views
0

我開始爲我的項目進行單元測試,但遇到困難。當我單獨運行時,我有一個測試完美運行。當我運行了一大堆的測試中,我有,它失敗:(我已刪除了其他代碼和目的特定的類/變量/函數名)PHPUnit + PHPStorm:用於運行/調試的不同錯誤

class XYZTest extends PHPUnit_Framework_TestCase { 
    public function setUp() { 
     $xml = $this->createXML(); 
     //... 
    } 


    public function testWillFailUponRunAllTests() { 
     $this->subject = new XYZ(); 
     $result = $this->subject->getHelpText(); 
     //assert this and that 
    } 
} 

執行單個測試:完美運行。

執行所有測試:我得到了一個我已經注入的類的錯誤。這很奇怪,所以我想調試測試以瞭解發生了什麼。

調試所有測試:我甚至不得到的錯誤,因爲setUp()已經導致該錯誤消息:XYZTest::setUp(): Invalid State Error

很顯然,這種情況既不當我運行分離的考驗,也不當我運行所有在「正常」模式下進行測試。僅在調試模式下!

調試單一測試:我得到另一種行爲:
PHPUnit_Framework_TestResult::run(): Invalid State Error' in phar://C:/xampp/php/phpunit.phar/phpunit/Framework/TestResult.php on line 668。例如,只有當我設置斷點時纔會發生這種情況,而不是在禁用它們時發生。似乎PHPStorm錯誤。

我使用PHP 5.5.9,PHPStorm 7.1.3,PHPUnit 3.7.31,xDebug v2.2.3。我沒有使用任何PHP框架。在此先感謝您的幫助!

回答

0

我不相信你已經正確地關注了PHPUnit的教程。 setUp()函數在每次測試之前運行,因爲每個測試都是獨立運行的。因此,您需要爲此編寫測試。

class XYZTest extends PHPUnit_Framework_TestCase { 
    protected $xml;  // Internal Object for testing 

    // Assume you have autoloader configured in bootstrap. If not, Require your class to test 
    //require_once('YourXMLClass.php'); 
    public function setUp() 
    { 
     $this->xml = new YourXMLClass();  // Create the XML object so it exists for testing. 
    } 

    public function testXMLIsEmpty() 
    { 
     $this->assertNull($this->xml->subject); 
    } 

    public function testXMLSubjectSet() 
    { 
     $this->xml->SetSubject('Basic Text to be returned as XML subject field'); 
     $this->assertEquals('<subject>Basic Text to be returned as XML subject field</subject>', $this->xml->subject); 
    } 
} 

我的測試中的假設是您的類中有一個SetSubject方法,該方法將參數添加到XML的主題字段中。 IE:

public function SetSubject($SubjectText) 
{ 
    $this->subject = '<subject>' . $SubjectText . '</subject>'; 
} 
+0

我不知道setUp()是在每次測試之前執行的,謝謝!我的測試看起來完全像你的模擬。問題是我得到一個錯誤,但無法調試 - 無論我在XPSTest的哪一行放置PHPStorm,下一步進入/ Step Over都會拋出「無效狀態錯誤」並中止調試。在本身運行'XYZTest'仍然沒有任何錯誤。我會更新我的問題。 – PeerBr

+0

Steven,我發現了這個錯誤,它與PHPStorm的bootstrap文件有關,它似乎有一些不一致之處。此外,無論是PHPStorm還是PHPUnit似乎都會在PHP拋出錯誤時開始表現得非常奇怪,我之前遇到過這種情況。這可能是開發人員最好的解決辦法,但是謝謝你向正確的方向暗示我。 – PeerBr

+1

@PeerBr這個錯誤很有趣。過去我已經能夠使用NetBeans和PHPStorm進行調試,但最近沒有嘗試過,也沒有嘗試過您列出的版本。除了setUp()之外,PHPUnit文檔的第6部分還有一個匹配的tearDown()和setUpBeforeClass()/ tearDownAfterClasS()。 –