2010-07-20 11 views
12

में यूनिट परीक्षण के लिए संसाधन फ़ाइल समेत मेरे पास कुछ फ़ंक्शन हैं जो & फ़ाइलों को संशोधित करते हैं। यूनिट परीक्षण किसी भी फाइल सिस्टम के मुद्दों से स्वतंत्र बनाने के लिए, मैं परियोजना के अंदर फाइलों को शामिल करना चाहता हूं।सी # प्रोजेक्ट

हालांकि, मेरे फ़ंक्शन को फ़ाइलपैथ मिलना चाहिए, और जो भी मैं असेंबली से प्राप्त कर सकता हूं वह एक फ़ाइलस्ट्रीम है। कोई विचार है कि मैं प्रोजेक्ट में संसाधन फ़ाइल का फ़ाइल पथ कैसे प्राप्त कर सकता हूं?

System.Reflection.Assembly a = System.Reflection.Assembly.Load(assemblyName); 
FileStream stream = a.GetFile(assemblyName + "." + fileName); 

धन्यवाद!

+1

IMHO इस तरह के परीक्षण डेटा कभी नहीं परीक्षण में बनाया जाना चाहिए और अलग से आपूर्ति की जानी चाहिए (जो भी आप पुनर्निर्माण के बिना अलग डेटा के साथ परीक्षण को फिर से चलाएं की सुविधा देता है)। आप किस तरह के फाइल सिस्टम मुद्दों के बारे में चिंतित हैं? –

+2

मुझे बाहरी संसाधनों पर निर्भर होने वाले यूनिट परीक्षण पसंद नहीं हैं, जिन्हें बदला जा सकता है, स्थानांतरित किया जा सकता है, बदला जा सकता है, और आगे भी। यह इकाई परीक्षण 1 परिदृश्य की जांच के लिए किया जाता है, और मैं चाहता हूं कि सटीक परिदृश्य का परीक्षण किया जाए, इसलिए यह फ़ाइल अनुमतियों को बदलने के तथ्य से स्वतंत्र होना चाहिए, बहुत से फ़ाइल हैंडलर खुले हैं, एनटीएफएस डिस्क अनुपलब्ध है, और बहुत आगे .. – Yossale

+0

मुझे लगता है कि यह एक बहुत अच्छा सवाल है। वास्तविक यूनिट परीक्षणों के लिए मैं मानता हूं कि फ़ाइल डेटा का उपयोग करना टालना चाहिए, लेकिन यदि आप 'वास्तविक' परीक्षण डेटा का उपयोग करके एकीकरण परीक्षण (उदा। मैं वर्तमान में एक फाइल रीडर लिख रहा हूं) के बारे में सोचता हूं तो मुझे समझ में आता है। – anhoppe

उत्तर

8

इस समस्या का मेरा सामान्य समाधान यह है कि मैं अपने प्रोग्राम को कॉलिंग विधि में फ़ाइल खोलने के लिए दोबारा दोहराता हूं और फिर फ़ाइल नाम पास करने और वहां फ़ाइल खोलने के बजाय स्ट्रीम पास करता हूं।

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

मेरे कार्यक्रमों में से एक से

उदाहरण:

public TestSaveAndLoad() 
{ 
    [... create data to save ...] 
    using (MemoryStream targetStream = new MemoryStream()) 
    { 
    target.Save(targetStream); 
    targetStream.Flush(); 
    targetStream.Seek(0, ...); 
    target.Load(targetStream); 
    } 
    [... assert that the loaded data equals the saved data ...] 
} 
+0

कूल। मुझे उन सभी धाराओं को चारों ओर दौड़ना पसंद नहीं आया, और यह एक अच्छा समाधान की तरह दिखता है। – Yossale

0

यदि आप प्रतिलिपि बनाने के लिए फ़ाइल की बिल्ड एक्शन सेट करते हैं, तो आप भविष्यवाणी कर सकते हैं कि फ़ाइल कहां होनी चाहिए (शायद .. का एक समूह .. \ .. \ .. \ 'लेकिन अभी भी)। मुझे लगता है कि आपके पास फ़ाइल नाम के लिए आपकी विधि पर एक इनपुट है, इसलिए इसे ठीक काम करना चाहिए।

बस एक सुझाव के रूप में, क्या उस फ़ाइल के वास्तविक पढ़ने/परिवर्तन को विधि में परिवर्तित करना और स्ट्रिंग मान पास करना संभव है? मैं इसे लाने का एकमात्र कारण यह है कि यह एकीकरण परीक्षण की तरह गंध करता है (फाइल सिस्टम को छूता है)।

4

फ़ाइल सिस्टम पर एक एम्बेडेड संसाधन मौजूद नहीं है, इसलिए इसमें कोई फ़ाइल पथ नहीं है।

  • बदलें तो अपने SUT की एपीआई है कि यह केवल एक फ़ाइल पथ के बजाय एक स्ट्रीम स्वीकार करता है:

    आपके पास दो विकल्प। यह समाधान बहुत पसंदीदा है।

  • यूनिट परीक्षण के दौरान एम्बेडेड संसाधन को अस्थायी फ़ाइल में सहेजें, प्रत्येक टेस्ट केस के बाद इसे फिर से हटाना सुनिश्चित करें।

पहला समाधान कैसे TDD बेहतर, अधिक लचीला एपीआई की ओर हमें ड्राइव का एक उत्कृष्ट उदाहरण है।

+0

मैंने स्ट्रीम के साथ चारों ओर शुरू किया, लेकिन मुझे लगा जैसे मैं हवा में खुले हैंडलर के लिए जॉगलिंग कर रहा हूं। हालांकि, मैं इसे एक दूसरा विचार दूंगा। धन्यवाद। – Yossale

+1

आप हमेशा अधिभारित विधियां बना सकते हैं: एक जो फ़ाइल पथ लेता है, लेकिन वास्तव में केवल स्ट्रीम के लिए दूसरे को प्रतिनिधि करता है ... –

1

प्रोजेक्ट बनने पर आप डेटा फ़ाइलों को बिन निर्देशिका में कॉपी करने के लिए सेट कर सकते हैं, फिर उन्हें अपने परीक्षण में Directory.GetCurrentDirectory() के माध्यम से संदर्भित करें। या यहां तक ​​कि उन्हें छोड़ दें और वर्तमान निर्देशिका के आधार पर एक सापेक्ष पथ का उपयोग करें।

बेहतर, हालांकि, स्ट्रीम क्लास पर भरोसा करने के लिए अपने कोड को पुन: स्थापित करना होगा, फिर डेटा के साथ नकली धारा की आपूर्ति करने के लिए मॉकिंग और निर्भरता इंजेक्शन के संयोजन का उपयोग करें - या मेमोरी स्ट्रीम का उपयोग करें, अगर बेहतर काम करता है।

+1

कुछ परीक्षण धावकों के पास परीक्षण चलाने पर वर्तमान निर्देशिका के रूप में बिन निर्देशिका नहीं है। तैनाती निर्देशिका प्राप्त करने के लिए 'AppDomain.CurrentDomain.BaseDirectory' का उपयोग करें, न कि 'Directory.GetCurrentDirectory()'। – Sjoerd

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