मुझे लगता है कि राज्य/इंटरैक्शन आधारित परीक्षण (फाउलर चीज़, आदि पढ़ें) की परिभाषा को समझते हैं। मैंने पाया कि मैंने राज्य आधारित शुरू किया है लेकिन अधिक बातचीत कर रहा है और मुझे कुछ चीजों का परीक्षण करने के बारे में थोड़ा उलझन में आ रहा है।राज्य/इंटरैक्शन परीक्षण और मिश्रण (या दुरुपयोग) पर भ्रम
मैं MVC में एक नियंत्रक है और एक कार्य एक पैकेज से इनकार करने के लिए एक सेवा कॉल:
public ActionResult Deny(int id)
{
service.DenyPackage(id);
return RedirectToAction("List");
}
यह मेरे लिए स्पष्ट लगता है। एक नकली सेवा प्रदान करें, सत्यापित करें कि इसे सही ढंग से कहा गया था, किया गया।
public ActionResult Upload(int id)
{
var package = packageRepository.GetPackage(id);
var certificates = certificateRepository.GetAllCertificates();
var view = new PackageUploadViewModel(package, certificates);
return View(view);
}
यह एक मैं थोड़ा पर स्टम्प्ड हूँ:
अब, मैं एक दृश्य के उपयोगकर्ता एक पैकेज के साथ एक प्रमाण पत्र से जोड़ पाएंगे कि के लिए एक कार्य है। मैं इस विधि का परीक्षण करने के लिए स्पेक स्टाइल टेस्ट (संभवतः गलत तरीके से) कर रहा हूं, मेरे पास एक वर्ग है और फिर दो परीक्षण हैं: पैकेज रिपॉजिटरी को सत्यापित किया गया था, प्रमाणपत्र संग्रह को सत्यापित किया गया था। मैं वास्तव में यह सत्यापित करने के लिए एक तिहाई परीक्षण करना चाहता हूं कि कन्स्ट्रक्टर को बुलाया गया था लेकिन उसे नहीं पता कि यह कैसे करना है! मुझे लगता है कि यह पूरी तरह गलत है।
इसलिए राज्य आधारित परीक्षण के लिए मैं आईडी में पास करूंगा और फिर ActionResult के दृश्य का परीक्षण करूंगा। ठीक है, यह समझ में आता है। लेकिन क्या मेरे पास PackageUploadViewModel कन्स्ट्रक्टर पर कोई परीक्षण नहीं होगा? तो अगर मेरे पास कन्स्ट्रक्टर पर एक परीक्षण है, तो मेरा हिस्सा सिर्फ यह सत्यापित करना चाहता है कि मैं कन्स्ट्रक्टर को कॉल करता हूं और यह कि कंट्रोल रिटर्न कन्स्ट्रक्टर द्वारा लौटाता है।
अब, एक और विकल्प मैं सोच सकता हूं कि मेरे पास एक पैकेजउप्लोडव्यूमोडेलबिल्डर (या कुछ समान रूप से नामित) है जो दो भंडारों पर निर्भरता रखता है और फिर मैं आईडी को CreateViewModel विधि या कुछ पर पास करता हूं। मैं फिर इस वस्तु का नकल कर सकता हूं, सब कुछ सत्यापित कर सकता हूं, और खुश रहूंगा। लेकिन ... अच्छा ... यह असाधारण लगता है। मैं कुछ सरल बना रहा हूं ... सरल नहीं। इसके अलावा, नियंत्रक.एक्शन (आईडी) बिल्डर.क्रिएट (आईडी) लौटने की तरह किसी भी कारण के लिए परत जोड़ने जैसा लगता है (नियंत्रक दृश्य मॉडल बनाने के लिए ज़िम्मेदार है .. सही?)
मुझे पता नहीं ... मैं सोच रहा हूँ अधिक राज्य आधारित परीक्षण जरूरी है, लेकिन मुझे डर है कि अगर मैं रिटर्न वैल्यू का परीक्षण शुरू करता हूं तो अगर विधि ए को 8 अलग-अलग संदर्भों में बुलाया जा सकता है तो मुझे कई पुनरावृत्ति के साथ एक परीक्षण विस्फोट होगा। मैं विधि बी में उन संदर्भों में से कुछ को पारित करने के लिए इंटरैक्शन आधारित परीक्षण का उपयोग कर रहा था ताकि मुझे बस इतना करना है कि विधि ए को विधि बी कहा जाता है और मेरे पास विधि बी का परीक्षण किया गया है, इसलिए विधि ए केवल भरोसा कर सकता है कि उन संदर्भों को संभाला जाता है। तो इंटरैक्शन आधारित परीक्षण परीक्षणों के इस पदानुक्रम का निर्माण कर रहा है लेकिन राज्य आधारित परीक्षण कुछ इसे बाहर करने जा रहा है।
मुझे कोई जानकारी नहीं है कि इससे कोई समझ हो।
वाह, यह लंबा है ...
हाँ में "स्टब प्रश्नों, नकली कार्रवाई" की एक अनुमानी है, इंकार उदाहरण सुपर स्पष्ट है कि मैं बातचीत का परीक्षण किया जाना चाहिए था। अपलोड एक मुझे भ्रमित कर रहा था। मैं xUnit पैटर्न के साथ बाड़ पर था (यह स्पष्ट रूप से विशाल था और मुझे डर था कि मैं इसे खरीदूंगा और इसे नहीं पढ़ूंगा) लेकिन रेफ़रल इसके लायक हो सकता है। एक बात, और यह सिर्फ एक विवरण हो सकता है, लेकिन अपलोड एक का परीक्षण करने के लिए (जो मुझे एहसास करता है कि एक भयानक नाम क्या है कि कार्रवाई ... रिफैक्टर समय), मैं या तो (ए) मैन्युअल रूप से परीक्षण में दृश्य बना सकता हूं और सत्यापित करें कि दोनों विचार बराबर हैं या (बी) परीक्षण करें कि दृश्य पर प्रत्येक प्रॉपर्टी इसके बराबर है। पसंद? – anonymous
@eyston: रॉय ओशरोव की पुस्तक "यूनिट परीक्षण की कला" एक अच्छा विकल्प है यदि आप डरते हैं कि दूसरा एक बहुत बड़ा मुंह वाला है - लेकिन आपको अभी भी इसे बाद की तारीख में पढ़ने की योजना बनाना चाहिए। –
@eyston: इससे कोई फर्क नहीं पड़ता कि आप केवल दो विचारों, या उनकी सभी संपत्तियों की स्वतंत्रता से तुलना करने का निर्णय लेते हैं, आप आमतौर पर एक लॉजिकल एसेशन कर रहे हैं। यह आसान है अगर आप एक दूसरे के साथ दो जटिल वस्तुओं की तुलना कर सकते हैं, लेकिन यह केवल तभी संभव है जब कक्षा सही तरीके से बराबर हो। चाहे आप एपीआई मॉडल को मॉडल करना चाहते हैं, इस पर आधारित एक निर्णय होना चाहिए या नहीं।दूसरे शब्दों में: परीक्षण के लिए बराबर ओवरराइड न करें, लेकिन यदि आप पहले से वांछित तरीके से बराबर ओवरराइड करते हैं, तो आप निश्चित रूप से इसका दावा करने के लिए इसका उपयोग कर सकते हैं। –