2012-07-31 13 views
6

मैं एक कस्टम दावा कैसे लिख सकता हूं, जैसे assertFoo($expected, $actual), जो त्रुटि "स्टैक ट्रेस" के संबंध में अंतर्निहित दावों की तरह व्यवहार करता है?कस्टम PHPUnit दावा कैसे लिखना है जो अंतर्निहित दावे की तरह व्यवहार करता है?

मैं वर्तमान में निम्न विधि परिभाषित (एक वर्ग है कि PHPUnit_Framework_TestCase फैली अंदर), है

public static function assertFoo($expected, $actual) { 
    self::assertEquals($expected, $actual); 
} 

अगर मैं एक परीक्षण से इस फोन और परीक्षण विफल रहता है, मैं कॉल स्टैक में दो आइटम प्राप्त:

1) PreferencesTest::testSignupTeacher 
Failed asserting that 5 matches expected 3. 

/vagrant/myproject/tests/integration/PreferencesTest.php:17 
/vagrant/myproject/tests/integration/PreferencesTest.php:136 

लाइन 17 वह जगह है जहां assertFoo() अंतर्निहित assertEquals() कॉल करता है और विफल रहता है; लाइन 136 है assertFoo() कहा जाता है।

मैं परीक्षण assertEquals() सीधे कॉल करने के लिए बदलते हैं, तो मैं केवल एक मिल:

1) PreferencesTest::testSignupTeacher 
Failed asserting that 3 is true. 

/vagrant/myproject/tests/integration/PreferencesTest.php:136 

कुछ documentation in the manual नहीं है, लेकिन यह इस कवर करने के लिए प्रतीत नहीं होता।

+0

क्या आप अपने assertFoo() फ़ंक्शन के लिए कोड दिखा सकते हैं। –

+0

@ डेरेनकूक निश्चित, अपडेट किया गया। – mjs

उत्तर

3

समस्या का मेरा पहला अनुमान (कि आप PHPUnit_Framework_Constraint_* ऑब्जेक्ट्स और self::assertThat में से किसी एक का उपयोग नहीं कर रहे हैं) पूरी तरह से अप्रासंगिक साबित हुए! वास्तविक जवाब यह है कि phpUnit अपने स्वयं के कोडबेस में स्टैक ट्रेस से कुछ भी मदद से फ़िल्टर करता है, और केवल उपयोगकर्ता स्थान में फ़ंक्शंस छोड़ देता है!

कोड इस /path/to/PHPUnit/Util/Filter.php (जहां को /path// मेरी मशीन पर /usr/share/php है) में पाया जा सकता है कि और ब्याज के कार्य getFilteredStacktrace और isFiltered हैं।

यदि आप इस व्यवहार को नियंत्रित करना चाहते हैं, तो अपने कस्टम आवेषण को PHPUnit_Framework_TestCase से प्राप्त कक्षा में रखें, फिर उस कक्षा से अपने परीक्षण प्राप्त करें। तब

class My_Base_TestCase extends PHPUnit_Framework_TestCase{ 
    public static function assertFoo($expected, $actual) { 
    self::assertEquals($expected, $actual); 
    } 
} 

PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'DEFAULT'); 

अन्य फ़ाइल आप में: अपने कस्टम वर्ग फ़ाइल में एक कॉल कहीं addFileToFilter करने के लिए, डाल जैसा कि यहाँ दिखाया

class CustomTest extends My_Base_TestCase{ 

    /** */ 
    public function testSomething2(){ 
    $this->assertFoo(8, 5+4); 
    } 
} 

और यह व्यवहार करेंगे जैसे निर्मित assertEquals()

अस्वीकरण: यह अनियंत्रित व्यवहार का उपयोग कर रहा है! मैं कोशिश करूँगा और पता लगाऊंगा कि यह तंत्र उचित भविष्य के सबूत होने जा रहा है या नहीं।

+1

दुर्भाग्यवश, ऐसा लगता है कि 'PHPUnit_Util_Filter :: addFileToFilter() '3.5 में गायब हो गया। 3.6 तरीका 'PHPUnit_Util_GlobalState :: phpunitFiles() 'का उपयोग करने के लिए प्रतीत होता है कि कौन सी फाइलों को निकालना है, जो स्थिर स्थिर स्थिर है ... मैं व्यवहार को संशोधित करने के किसी भी तरीके को नहीं देख सकता' PHPUnit_Util_Filter :: getFilteredStacktrace()' में 3.6। – mjs

+0

@ एमजेएस हा! भविष्य में सबूत नहीं तो माफ करना !! मुझे कहना चाहिए था कि मैं phpUnit 3.4.5 देख रहा था। अगर मुझे मौका मिलता है तो मैं कल नवीनतम phpUnit के साथ एक नज़र डालेगा। –

+0

PHPUnit 6 में बदल जाता है, आपको '\ PHPUnit \ Util \ Blacklist :: $ blacklistedClassNames ['My_Base_TestCase'] = 1;' –

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

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