2014-05-07 4 views
15

हम परीक्षण के लिए Xunit का उपयोग कर रहे हैं। हम Xunit प्लगइन का उपयोग कर अंतर्निहित विजुअल स्टूडियो 2013 टेस्ट रनर के माध्यम से अपने परीक्षण चला रहे हैं।विजुअल स्टूडियो में एक्स्यूनिट परीक्षणों से परीक्षण फ़ाइलों का संदर्भ कैसे लें?

समस्या यह है कि कुछ परीक्षणों को फाइल सिस्टम पर फ़ाइलों को संदर्भित करने की आवश्यकता है। ऐसा लगता है कि Xunit (या वीएस टेस्ट रनर - सुनिश्चित नहीं है कि), परीक्षणों को निष्पादित करने से पहले, एक अन्य निर्देशिका में, बिन निर्देशिका में किसी भी सहायक फाइलों को इकट्ठा नहीं करता है, लेकिन हमारी परीक्षण फाइलें नहीं मिलती हैं। [एमएस परीक्षण ढांचा फाइलें कॉपी करने के लिए लिस्टिंग के लिए गुण निर्दिष्ट करता है, लेकिन XUnit नहीं करता।]

कैसे या तो अक्षम इस नकल व्यवहार, वरना प्रोग्राम के रूप में मूल bin/ निर्देशिका स्थान फ़ाइलें लाने के लिए निर्धारित करने के लिए?

ऐसा लगता है कि सबसे प्रस्तावित समाधान (Xunit बग-ट्रैकर साइट सहित) फ़ाइलों को 'कॉपी हमेशा' फ़ाइलों के बजाय एम्बेडेड संसाधनों के रूप में संग्रहीत करने का सुझाव देते हैं। हालांकि, यह हमेशा व्यावहारिक नहीं है, उदाहरण के लिए: परीक्षण फ़ाइल मैनिपुलेशन कोड, और (एक मामले में) कोड जो एक स्क्लाइट डेटाबेस फ़ाइल चाहता है।

उत्तर

24

ठीक है, ठेठ, बस जैसे ही मैंने प्रश्न पोस्ट, मैं इस सवाल का जवाब अपने आप को लगता है ...

सार है कि विधानसभाओं की नकल (छाया प्रतिलिपि बनाई जा रही) नेट ढांचे द्वारा किया जाना है, नहीं लगता है विजुअल स्टूडियो द्वारा या जुनीट द्वारा।

हम असेंबली फ़ाइल का पता लगाने के लिए Assembly.Location का उपयोग कर रहे थे, और इसलिए परीक्षण फाइलें। हालांकि, यह गलत था, क्योंकि इससे हमें मूल के बजाय छाया-प्रतिबिंबित संयोजनों का स्थान दिया गया था।

इसके बजाय आपको बेस असेंबली कोड स्थान लाने के लिए Assembly.CodeBase का उपयोग करना चाहिए। हालांकि, यह एक (फ़ाइल) यूआरएल है, इसलिए यूआरएल से पथ निकालना जरूरी है। नई (सी #) कोड इस तरह दिखता है:

var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase); 
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath); 
var dirPath = Path.GetDirectoryName(codeBasePath); 
return Path.Combine(dirPath, relativePath); 

... जहां relativePathBin\ निर्देशिका के लिए पथ सापेक्ष है।

+0

दुर्भाग्य से, यह समाधान अब और काम नहीं करता है, प्रवेश बिंदु यूआरएल है अप्रासंगिक: System.IO.FileNotFoundException: फ़ाइल नहीं मिल सकी 'सी:। \ Users \ [उपयोगकर्ता नाम] \ nuget \ संकुल \ microsoft.testplatform.testhost \ 15.0.0 \ lib \ sample.log'। – st78

+0

@ st78 आपका क्या मतलब है 'अब और काम नहीं करता'- .NET का कौन सा संस्करण आप उपयोग कर रहे हैं? "एंट्री पॉइंट यूआरएल" से आपका क्या मतलब है? – andrewf

+1

xunit और .net कोर का उपयोग करते समय मुझे st78 के समान समस्या थी, लेकिन यह हल हो गया। मैं असेंबली का उपयोग कर रहा था। स्थान लेकिन मुझे त्रुटि थी कि st78 का उल्लेख है। कोडबेस का उपयोग करने से समस्या हल हो गई। – alas

2

मै मैक पर नेट कोर 1.0 चला रहा हूं। Assembly.GetExecutingAssembly अनुपलब्ध है। मैं निम्नलिखित कोड का उपयोग करें:

var location = typeof(YourClassName).GetTypeInfo().Assembly.Location; 
var dirPath = Path.GetDirectoryName(location); 
return Path.Combine(dirPath, relativePath); 

relativePath अपने DLL निर्देशिका के लिए पथ सापेक्ष है।

4

थोड़ी सी खोज के बाद मुझे यहां समाधान मिला: https://msdn.microsoft.com/en-us/library/ms182475.aspx

विशेष रूप से, पहला कदम मेरे लिए काफी कर दिया गया है:

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

निम्न कोड से जुड़े:

var filename = "./Resources/fake.pdf" 
File.OpenRead(filename) 

The test project (note the Resource folder) Cfg of files in the resource folder

+0

यह भी देखें: https://stackoverflow.com/questions/44374074/copy-files-to-output-directory-using-csproj-dotnetcore –

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

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