दिलचस्प पोस्ट
एक इंट को एक 4 बाइट चार सरणी में परिवर्तित करना (सी) आईफोन पर दृश्य प्रभाव को हिलाएं (डिवाइस को मिलाते हुए) Www के यूआरएल को एचटीएसीएक्स का उपयोग करने के लिए गैर-www की रीडायरेक्ट करने के लिए कैसे? jQuery, सरल मतदान उदाहरण PHP के साथ पूर्ण पथ से फ़ाइल नाम कैसे प्राप्त करें? एक चलती खिलाड़ी की ओर दुश्मन को कैसे ले जाएं? GetUserMedia द्वारा कैप्चर किए जाने के बाद WebRTC के साथ सर्वर होस्ट करने के लिए MediaStream भेजा जा रहा है बहुभुज को एक अक्षांश के पास प्राप्त करें, जो कि लंबे समय तक MySQL में है क्यों सी # में पूर्णांक विभाजन एक पूर्णांक देता है, लेकिन एक फ्लोट नहीं? पायथन रेगेक्स: पैटर्न मिलान पर विभाजन जो कि एक खाली स्ट्रिंग है I कोणीय – एकाधिक HTTP कॉल के डेटा तक पहुंच – कैसे वादे को हल करने के लिए सी ++ में सिंगलटन के सुरक्षित आलसी निर्माण को थ्रेड करें एक्सओर अक्सर जावा हैशोड () में क्यों उपयोग किया जाता है लेकिन एक और बिटवाइर्स ऑपरेटरों को शायद ही कभी प्रयोग किया जाता है? जो @NotNull जावा एनोटेशन मैं उपयोग करना चाहिए? Android से whatsapp संपर्क कैसे प्राप्त करें?

PHPUnit – मदों के साथ यूनिट परीक्षण जो हेडर भेजने की आवश्यकता होती है

मैं फिलहाल PHPUnit के साथ काम कर रहा हूं जो कि मैं लिख रहा हूँ के साथ परीक्षण करने और विकसित करने के लिए, हालांकि, मैं वर्तमान में सत्र प्रबंधक लिखने पर काम कर रहा हूं, और मुझे ऐसा करने में समस्याएं आ रही हैं …

सत्र हैंडलिंग वर्ग के लिए निर्माता है

private function __construct() { if (!headers_sent()) { session_start(); self::$session_id = session_id(); } } 

हालांकि, जैसा कि PHPUnit पाठ शुरू करने से पहले पाठ भेजता है, इस ऑब्जेक्ट पर कोई भी परीक्षण विफल परीक्षा देता है, क्योंकि HTTP "हेडर" भेजा गया है …

Solutions Collecting From Web of "PHPUnit – मदों के साथ यूनिट परीक्षण जो हेडर भेजने की आवश्यकता होती है"

खैर, आपका सत्र प्रबंधक मूल रूप से डिजाइन द्वारा तोड़ा गया है कुछ परीक्षण करने में सक्षम होने के लिए, इसे साइड इफेक्ट से अलग करना संभव होगा। दुर्भाग्य से, PHP को इस तरह से डिज़ाइन किया गया है, यह वैश्विक राज्य के उदार उपयोग को प्रोत्साहित करता है ( echo , header , exit , session_start , आदि आदि)।

सबसे अच्छी बात जो आप कर सकते हैं, एक घटक में दुष्प्रभाव को अलग करना है, जिसे रनटाइम पर स्वैप किया जा सकता है। इस तरह, आपके परीक्षण मच गए ऑब्जेक्ट का उपयोग कर सकते हैं, जबकि लाइव कोड एडाप्टर का उपयोग करता है, जो कि असली पक्ष-प्रभाव होते हैं आप पाएंगे कि यह अकेलापन के साथ अच्छा नहीं खेलता है, जो मुझे लगता है कि आप इसका प्रयोग कर रहे हैं। इसलिए आपको अपने कोड में साझा किए गए ऑब्जेक्ट वितरित करने के लिए कुछ अन्य तंत्र का उपयोग करना होगा। आप एक स्थैतिक रजिस्ट्री के साथ शुरू कर सकते हैं, लेकिन अगर आपको थोड़ा सा सीखना नहीं है, तो इससे भी बेहतर समाधान हो सकते हैं।

यदि आप ऐसा नहीं कर सकते, तो आपके पास हमेशा एकीकरण-परीक्षण लिखने का विकल्प होता है। उदाहरण के लिए। WebTestCase के PHPUnit के बराबर का उपयोग करें

phpUnit आउटपुट प्रिंट करता है क्योंकि परीक्षण इस प्रकार से चलाता है जिससे headers_sent () आपके पहले परीक्षण में भी वापस लौट आए।

एक पूरी परीक्षा सूट के लिए इस मुद्दे पर काबू पाने के लिए आपको बस अपनी सेटअप स्क्रिप्ट में ob_start () का उपयोग करना होगा।

उदाहरण के लिए, कहें कि आपके पास AllTests.php नामक फ़ाइल है जो कि पहली चीज है जिसे phpUnit द्वारा लोड किया गया है। यह स्क्रिप्ट निम्न की तरह दिख सकती है:

 <?php ob_start(); require_once 'YourFramework/AllTests.php'; class AllTests { public static function suite() { $suite = new PHPUnit_Framework_TestSuite('YourFramework'); $suite->addTest(YourFramework_AllTests::suite()); return $suite; } } 

Phpunit के लिए बूटस्ट्रैप फ़ाइल बनाएं, जो कॉल करता है:

 session_start(); 

फिर इस तरह phpunit शुरू:

 phpunit --bootstrap pathToBootstrap.php --anotherSwitch /your/test/path/ 

बूटस्ट्रैप फ़ाइल को सब कुछ पहले कहा जाता है, इसलिए हैडर भेजा नहीं गया है और सब कुछ ठीक काम करना चाहिए।

मेरे पास एक ही मुद्दा था और मैंने इसे phpunit को –stderr ध्वज के साथ इस तरह कॉल करके हल किया:

 phpunit --stderr /path/to/your/test 

आशा है कि यह किसी को मदद करता है!

मुझे लगता है कि "सही" समाधान एक बहुत सरल वर्ग बनाना है (बहुत आसान है इसे परीक्षण करने की आवश्यकता नहीं है) जो कि PHP के सत्र से संबंधित फ़ंक्शंस के लिए एक आवरण है, और इसे session_start() आदि को सीधे कॉल करने के बजाय इसका उपयोग करें।

एक असली राज्यपूर्ण, अप्रभावी सत्र वर्ग की बजाय परीक्षा पास नकली वस्तु में।

 private function __construct(SessionWrapper $wrapper) { if (!$wrapper->headers_sent()) { $wrapper->session_start(); $this->session_id = $wrapper->session_id(); } } 

क्या आप परीक्षण शुरू करने से पहले आउटपुट बफरिंग का उपयोग नहीं कर सकते हैं? यदि आप आउटपुट के सब कुछ बफर करते हैं, तो आपको कोई हेडर सेट करने में समस्या नहीं होनी चाहिए क्योंकि उस समय कोई आउटपुट क्लाइंट को नहीं भेजा गया है।

यहां तक ​​कि अगर ओबी आपकी कक्षाओं के अंदर कहीं भी प्रयोग किया जाता है, तो यह स्टैकेबल होता है और ओबी को अंदर क्या हो रहा है पर इसका कोई असर नहीं होना चाहिए

जहाँ तक मुझे पता है कि ज़ेंड फ्रेमवर्क उनके Zend_Session पैकेज परीक्षणों के लिए समान आउटपुट बफ़रिंग का उपयोग करता है। आप शुरू करने के लिए उनके परीक्षण के मामलों पर एक नज़र डाल सकते हैं।

बूटस्ट्रैप फ़ाइल का निर्माण, 4 पदों की ओर इशारा करते हुए इस चारों ओर साफ तरीके लगता है।

प्रायः PHP के साथ हमें विरासत वाले परियोजनाओं को बनाए रखने और किसी तरह की इंजीनियरिंग अनुशासन जोड़ने की कोशिश करनी पड़ती है, जो कि बेईमानी से एक साथ रखी जाती हैं। हमारे पास समय (या प्राधिकरण) नहीं है जो कचरे के पूरे ढेर को ख़त्म करने और फिर से शुरू करने के लिए है, इसलिए ट्रायल्स के द्वारा पहले एवर हमेशा आगे बढ़ने के तरीके के रूप में संभव नहीं है। (यदि हम शुरुआती डिजाइन पर वापस जा सकते हैं, तो हम PHP को पूरी तरह से खा सकते हैं और वेब डेवलपमेंट की दुनिया के इस कोबोल को बनाए रखने के बजाय, कुछ और आधुनिक, जैसे कि रूबी या अजगर का उपयोग कर सकते हैं।)

यदि आप उन मॉड्यूलों के लिए यूनिट परीक्षण लिखने का प्रयास कर रहे हैं जो सत्र-प्रारंभ या सेटक्यूकी का उपयोग करते हैं, तो एक बूटस्ट्रैप फ़ाइल में सत्र शुरू करने से इन मुद्दों को आपके गोल हो जाते हैं

जैसा कि मैं अभी अपने बूटस्ट्रैप को एकजुट कर रहा हूं (हाँ, मुझे पता है कि आप में से ज्यादातर ऐसा नहीं करते हैं), मैं एक ही समस्या (हेडर () और session_start ()) में चल रहा हूं। मैंने जो समाधान पाया है, वह सरल है, आपके सबसे सरलतम बूटस्ट्रैप में एक स्थिरता को परिभाषित करता है और केवल हेडर भेजने या सत्र शुरू करने से पहले इसे जांचें:

 // phpunit_bootstrap.php define('UNITTEST_RUNNING', true); // bootstrap.php (application bootstrap) defined('UNITTEST_RUNNING') || define('UNITTEST_RUNNING', false); ..... if(UNITTEST_RUNNING===false){ session_start(); } 

मैं मानता हूं कि यह डिजाइन द्वारा परिपूर्ण नहीं है, लेकिन मैं एक मौजूदा आवेदन को जोड़ रहा हूं, बड़े अक्षरों को फिर से लिखना वांछित नहीं है। मैं __call () और __set () जादू विधियों का उपयोग करके निजी तरीकों का परीक्षण करने के लिए एक ही तर्क का उपयोग कर रहा हूं।

 public function __set($name, $value){ if(UNITTEST_RUNNING===true){ $name='_' . $name; $this->$name=$value; } throw new Exception('__set() can only be used when unittesting!'); } 

मुझे आश्चर्य है कि क्यों कोई भी XDebug विकल्प सूचीबद्ध नहीं है:

 /** * @runInSeparateProcess * @requires extension xdebug */ public function testGivenHeaderIsIncludedIntoResponse() { $customHeaderName = 'foo'; $customHeaderValue = 'bar'; // Here execute the code which is supposed to set headers // ... $expectedHeader = $customHeaderName . ': ' . $customHeaderValue; $headers = xdebug_get_headers(); $this->assertContains($expectedHeader, $headers); } 

ऐसा लगता है कि आपको सत्र को इंजेक्शन लगाने की आवश्यकता है ताकि आप अपना कोड जांच सकें। मैंने सबसे अच्छा विकल्प का उपयोग किया है प्रमाणीकरण प्रक्रिया के लिए Aura.Auth और परीक्षण के लिए NullSession और NullSegment का उपयोग करते हुए।

रिक्त सत्रों के साथ आभा परीक्षण

आभा फ्रेमवर्क सुंदर रूप से लिखा गया है और आप आभा फ्रेमवर्क निर्भरताओं के बिना अपने आप पर आभा.ऑथ का उपयोग कर सकते हैं।