2011-02-19 15 views
16

में PHP चेतावनी को कैसे पकड़ें मैं परीक्षण के मामलों को लिख रहा हूं और यहां एक प्रश्न है।PHPUnit

तो मैं एक साधारण समारोह someClass::loadValue($value)

सामान्य परीक्षण का मामला आसान है परीक्षण कर रहा हूँ, लेकिन यह मान जब अशक्त या -1 समारोह कॉल में गुजर एक PHP चेतावनी है, जो एक बग माना जाता है उत्पन्न करता है का कहना है।

सवाल यह है कि, मैं अपना PHPUnit परीक्षण केस कैसे लिखूं ताकि यह सफल हो जाए जब फ़ंक्शंस शून्य/-1 को शानदार तरीके से संभालता है, और PHP चेतावनी फेंकने पर असफल हो जाता है?

धन्यवाद,

उत्तर

-1

SomeClass एक त्रुटि फेंक जब इनपुट अमान्य है और PHPUnit बता एक त्रुटि उम्मीद करना सुनिश्चित करें।

एक विधि यह है:

class ExceptionTest extends PHPUnit_Framework_TestCase 
{ 
    public function testLoadValueWithNull() 
    { 
     $o = new SomeClass();    
     $this->setExpectedException('InvalidArgumentException'); 
     $this->assertInstanceOf('InvalidArgumentException', $o::loadValue(null)); 
    } 
} 

अधिक तरीकों के लिए documentation देखें।

+3

इस विधि परीक्षण के अंतर्गत वर्ग जो शायद अमान्य तर्क मूल्यों के लिए एक अच्छा विचार है फेरबदल की आवश्यकता है:

PHPUnit v6.0 के लिए + इस तिथि वाक्य रचना पर निर्भर है। –

+1

यह दृष्टिकोण उन परिस्थितियों के लिए बहुत अधिक उपयोग नहीं है जहां आप अपनी विधि को चेतावनी लॉग करना और जारी रखना चाहते हैं। उदाहरण के लिए यदि आप संख्याओं को विभाजित कर रहे हैं और एक पूर्णांक आउटपुट की आवश्यकता है तो आपकी कक्षा परिणाम के दौर में हो सकती है और यह इंगित करने के लिए एक E_USER_WARNING जारी कर सकती है कि एक गोलाकार हुआ। यदि आप इसके बजाय अपवाद फेंकते हैं तो निष्पादन का प्रवाह बाधित हो जाएगा। – GordonM

34

PHPUnit_Util_ErrorHandler::handleError() कई अपवाद त्रुटि कोड के आधार पर प्रकारों में से एक फेंकता है: अन्य सभी के लिए

  • E_NOTICE के लिए PHPUnit_Framework_Error_Notice, E_USER_NOTICE, और E_STRICT
  • E_WARNING के लिए PHPUnit_Framework_Error_Warning और E_USER_WARNING
  • PHPUnit_Framework_Error

आप इन्हें पकड़ सकते हैं और उम्मीद कर सकते हैं क्योंकि आप कोई अन्य अपवाद करेंगे।

/** 
* @expectedException PHPUnit_Framework_Error_Warning 
*/ 
function testNegativeNumberTriggersWarning() { 
    $fixture = new someClass; 
    $fixture->loadValue(-1); 
} 
3

तुम भी एक phpunit.xml फ़ाइल (अपने परीक्षण dir पर) इस के साथ लिख सकते हैं:

<phpunit 
convertErrorsToExceptions="true" 
convertNoticesToExceptions="false" 
stopOnFailure="false"> 
</phpunit> 
7

क्या मेरे लिए काम किया मेरी phpunit.xml को संशोधित किया गया था

<phpunit 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     strict="true" 
     > 
</phpunit> 
के लिए

चेतावनी प्राप्त करने के लिए चेतावनी प्राप्त करने के लिए strict="true" का उपयोग करना था।

2

नोटिस/चेतावनी की अपेक्षा होने पर मैं परीक्षण करने के लिए एक अलग केस तैयार करूंगा।

use PHPUnit\Framework\Error\Notice; 
use PHPUnit\Framework\Error\Warning; 
use PHPUnit\Framework\TestCase; 

class YourShinyNoticeTest extends TestCase 
{ 

    public function test_it_emits_a_warning() 
    { 
     $this->expectException(Warning::class); 

     file_get_contents('/nonexistent_file'); // This will emit a PHP Warning, so test passes 
    } 


    public function test_it_emits_a_notice() 
    { 
     $this->expectException(Notice::class); 

     $now = new \DateTime(); 
     $now->whatever; // Notice gets emitted here, so the test will pass 
    } 
} 
+0

ध्यान दें कि यह केवल PHP 7.0 के लिए काम करेगा। किसी भी बाद के संस्करणों में अन्य PHP-विशिष्ट अपवाद हैं। – sanmai

+0

@sanmai मुझे वह समस्या नहीं दिखाई देती है। ऊपर दिया गया उदाहरण PHP 7.2 और PHPUnit 7.0 के साथ भी काम करता है - बस इसे स्वयं परीक्षण किया। –

 संबंधित मुद्दे