5

मान लीजिए कि आप अगर एक पेज उचित यूआरएल द्वारा पहुँच गया था जांच करने के लिए एक समारोह लिख रहे हैं। एक पेज stackoverflow.com/questions/123 पर संपर्क किया जा सकता है, जबकि, उदाहरण के लिए, हम (एसईओ कारणों के लिए) पसंद करेंगे यह रीडायरेक्ट करने के लिए stackoverflow.com/questions/123/how-do के लिए - पेज एक "प्रामाणिक" ठूंठ है मैं-चाल-कछुआ-इन-लोगो - और वास्तविक रीडायरेक्ट सुरक्षित रूप से अपनी ही विधि में निहित है (उदाहरण के लिए redirectPage ($ url)।), लेकिन कैसे आप ठीक ढंग से समारोह है जो यह कहता है परीक्षण करते हैं?साइड इफेक्ट्स के साथ यूनिट परीक्षण फ़ंक्शन?

उदाहरण के लिए, निम्नलिखित समारोह ले:

function checkStub($questionId, $baseUrl, $stub) { 
    canonicalStub = model->getStub($questionId); 
    if ($stub != $canonicalStub) { 
    redirectPage($baseUrl . $canonicalStub); 
    } 
} 

यदि आप इकाई परीक्षण करने के लिए checkStub() फ़ंक्शन थे, रीडायरेक्ट रास्ते में नहीं होगा?

यह एक बड़ी समस्या का हिस्सा है जहां कुछ कार्य बहुत बड़े होते हैं और इकाई परीक्षण के क्षेत्र को छोड़कर एकीकरण परीक्षण की दुनिया में छोड़ देते हैं। मेरा दिमाग तुरंत रूटर और नियंत्रकों के बारे में सोचता है क्योंकि इन प्रकार की समस्याएं होती हैं, क्योंकि उनका परीक्षण करने के लिए आवश्यक रूप से अपने स्वयं के कार्य तक ही सीमित होने के बजाय पृष्ठों की पीढ़ी की ओर जाता है।

क्या मैं इकाई परीक्षण में बस असफल हूं?

+0

धीरे ... और क्या तुम सच में यहाँ का परीक्षण करने के ... आप रीडायरेक्ट, checkStub निकाल देते हैं तो कोशिश कर रहे हैं पर पुनर्विचार विधि बहुत कुछ नहीं करती है इसलिए मुझे यहां वास्तविक परीक्षण की जानकारी नहीं है। आम तौर पर आप दुष्प्रभावों का परीक्षण करते हैं कि इस तरह के एक समारोह का कारण बनता है। – Gishu

+0

@ गिशू: हाँ, यह एक अविश्वसनीय रूप से दोषपूर्ण उदाहरण है जिसे मैंने पहले की समस्या से हल किया था .. समस्या ठीक हो गई थी, लेकिन उदाहरण (रीडायरेक्टिंग) मेरे सिर में फंस गया।प्रश्न के अंत में फोकस करें - राउटर, नियंत्रक - प्रश्न के असली मांस के रूप में। मैं उन कार्यों का परीक्षण कैसे करूं जिनके फोकस बड़े पैमाने पर "चीजें बनाते हैं" लेकिन जिन्हें अभी भी अपने आंतरिक आदेश और तर्क के कारण परीक्षण करने की आवश्यकता है। मैं अब बाहर निकलने जा रहा हूं और मैं सुबह में इस सवाल से नरक को संपादित कर दूंगा। उम्मीद है कि अब आप मेरा इरादा देख सकते हैं (यह जानने में मदद कर सकता है कि मैं यूनिट परीक्षण के लिए नया ब्रांड हूं)। – AgentConundrum

+0

आपने बहुत कुछ कहा है कि आप वस्तु निर्माण के साथ तर्क मिश्रण कर रहे हैं, जो यूनिट परीक्षण को मुश्किल बनाता है। क्या आप इन दो चिंताओं को विभाजित कर सकते हैं? यदि ऐसा है, तो अपने यूनिट परीक्षण लिखना बहुत छोटा होगा। – strager

उत्तर

0

ऐसा लगता है कि आपके पास सिर्फ एक और परीक्षण केस है। आपको यह जांचने की ज़रूरत है कि स्टब को सकारात्मक और नकारात्मक परीक्षण दोनों के साथ एक स्टब के रूप में सही ढंग से पहचाना जाता है, और आपको यह जांचने की आवश्यकता है कि जिस पृष्ठ पर आपको रीडायरेक्ट किया गया है वह सही है।

या क्या मैं इस सवाल को पूरी तरह गलत समझता हूं?

+2

क्या आप अपना प्रश्न संपादित कर सकते हैं और अपना टाइपो kthx ठीक कर सकते हैं? – strager

1

आप कहते हैं ...

जहां कुछ कार्यों एकीकरण परीक्षण की दुनिया में बहुत बड़ा हो और इकाई परीक्षण के दायरे को छोड़ने के लिए और लगता है यह एक बड़ा समस्या का हिस्सा है

मुझे लगता है कि यही कारण है कि इकाई परीक्षण (1) कठिन है और (2) उस कोड की ओर जाता है जो अपने वजन के नीचे नहीं गिरता है। आपको अपनी सभी निर्भरताओं को तोड़ने के बारे में सावधानी बरतनी होगी या आप इकाई परीक्षण == एकीकरण परीक्षण के साथ समाप्त होना चाहिए।

आपके उदाहरण में, आप एक पुनर्निर्देशक को निर्भरता के रूप में इंजेक्ट करेंगे। आप एक नकली, डबल या जासूसी का उपयोग करें। फिर आप परीक्षण करते हैं जैसे @atk बाहर निकलता है। कभी-कभी यह इसके लायक नहीं है। अधिक बार यह आपको बेहतर कोड लिखने के लिए मजबूर करता है। और आईओसी कंटेनर के बिना करना मुश्किल है।

1

यह एक पुराना सवाल है, लेकिन मुझे लगता है कि यह उत्तर प्रासंगिक है। @ रोब बताता है कि आप एक निर्भरता के रूप में एक पुनर्निर्देशक इंजेक्षन करेंगे - और यकीन है, यह काम करता है। हालांकि, आपकी समस्या यह है कि आपके पास चिंताओं का अच्छा अलगाव नहीं है।

आपको अपने कार्यों को यथासंभव परमाणु बनाने की आवश्यकता है, और फिर आपके द्वारा बनाए गए दानेदार कार्यों का उपयोग करके बड़ी कार्यक्षमता लिखें। आप ने लिखा है इस:

function checkStub($questionId, $baseUrl, $stub) { 
    canonicalStub = model->getStub($questionId); 
    if ($stub != $canonicalStub) { 
    redirectPage($baseUrl . $canonicalStub); 
    } 
} 

मैं इस बारे में चाहते हैं:

function checkStubEquality($stub1, $stub2) { 
    return $stub1 == $stub2; 
    } 

    canonicalStub = model->getStub($questionId); 
    if (!checkStubEquality(canonicalStub, $stub)) redirectPage($baseUrl . $canonicalStub); 
संबंधित मुद्दे