2010-10-11 12 views
6

के साथ टीडीडी का उपयोग करके मैंने एक्सेल फ़ाइलों से डेटा पढ़ने वाले छोटे ऐप को विकसित करने के लिए एक टीडीडी दृष्टिकोण का उपयोग करना शुरू कर दिया है। एक रिपोजिटरी पैटर्न प्रकार दृष्टिकोण का उपयोग करके मैं एक बाधा उत्पन्न कर चुका हूं जो मुझे परेशान करता है।ओपनएक्सएमएल-एसडीके

एक्सेल फ़ाइलों को पढ़ने के लिए, मैं OpenXml-SDK का उपयोग कर रहा हूं। अब आम तौर पर एसडीके का उपयोग कर एक्सेल फ़ाइल से पढ़ने की आवश्यकता होती है, यदि वास्तव में उन मानों को प्राप्त करने के लिए अधिक कदम नहीं हैं जिन्हें आप पढ़ना चाहते हैं।

जिस दृष्टिकोण को मैंने अभी तक लिया है, वह निम्नलिखित परीक्षण और साथ में कार्य में दिखाई देता है।

[Test] 
    public void GetRateData_ShouldReturn_SpreadSheetDocument() 
    { 
     //Arrange 
     var fpBuilder = new Mock<IDirectoryBuilder>(); 
     fpBuilder.Setup(fp => fp.FullPath()).Returns(It.IsAny<string>()); 

     var doc = new Mock<IOpenXmlUtilities>(); 
     doc.Setup(d => d.OpenReadOnlySpreadSheet(It.IsAny<string>())) 
      .Returns(Mock.Of<SpreadsheetDocument>()); 

     swapData = new SwapRatesRepository(fpBuilder.Object, doc.Object); 

     //Act 
     var result = swapData.GetRateData(); 

     //Assert 
     doc.Verify(); 
     fpBuilder.Verify(); 
    } 

public class SwapRatesRepository: IRatesRepository<SwapRates> 
{ 
    private const string SWAP_DATA_FILENAME = "DATE_MKT_ZAR_SWAPFRA1.xlsx"; 
    private IDirectoryBuilder builder; 
    private IOpenXmlUtilities openUtils; 

    public SwapRatesRepository(IDirectoryBuilder builder) 
    { 
     // TODO: Complete member initialization 
     this.builder = builder; 
    } 

    public SwapRatesRepository(IDirectoryBuilder builder, 
             IOpenXmlUtilities openUtils) 
    { 
     // TODO: Complete member initialization 
     this.builder = builder; 
     this.openUtils = openUtils; 
    } 

    public SwapRates GetRateData() 
    { 
     // determine the path of the file based on the date 
     builder.FileName = SWAP_DATA_FILENAME; 
     var path = builder.FullPath(); 

     // open the excel file 
     using(SpreadsheetDocument doc = openUtils.OpenReadOnlySpreadSheet(path)) 
     { 
      //WorkbookPart wkBookPart = doc.WorkbookPart; 
      //WorksheetPart wkSheetPart = wkBookPart.WorksheetParts.First(); 
      //SheetData sheetData = wkSheetPart.Worksheet 
      //         .GetFirstChild<SheetData>(); 

     } 

     return new SwapRates(); // ignore this class for now, design later 
    } 
} 

हालांकि, स्प्रेडशीट के बाद अगले चरणों का वास्तव में एक्सेल ऑब्जेक्ट मॉडल पूछताछ मूल्यों को पुनः प्राप्त करने शुरू करने के लिए किया जाएगा खुला है। जैसा ऊपर बताया गया है, मैं खुले एक्सएमएल से संबंधित किसी भी चीज़ के लिए मैक्स का उपयोग कर रहा हूं। हालांकि, कुछ मामलों में वस्तुओं को मजाक नहीं किया जा सकता है (या मुझे नहीं पता कि वे स्थिर हैं क्योंकि उन्हें स्थिर कैसे किया जाए)। इससे IOpenXmlUtilities तक वृद्धि हुई जो ओपनएक्सएमएल-एसडीके में केवल साधारण रैपर कॉल हैं।

डिज़ाइन के संदर्भ में, हम जानते हैं कि एक्सेल फ़ाइलों से डेटा पढ़ने का एक अल्पकालिक समाधान (6-8 महीने) है, इसलिए ये परीक्षण केवल इस समय के लिए भंडार/डेटा पहुंच को प्रभावित करते हैं।

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

* साइड नोट: मुझे पता है कि मेरे डिजाइन की सहिष्णुता में सुधार किया जा सकता है लेकिन मैं इसे अभी छोड़ रहा हूं। मेरे पास अलग-अलग परीक्षणों का एक सेट है जो builder ऑब्जेक्ट से संबंधित है। हो सकता है कि दूसरी तरफ प्रभाव एक ओपनएक्सएमएल-एसडीके रैपर लाइब्रेरी का डिज़ाइन हो।

संपादित करें: नाम एक अज्ञात समय में, OpenXML-SDK के लिए OpenXML-एसडीके रैपर बनाने के द्वारा, मैं एक डिजाइन पैटर्न समान (या सटीक) Adaptor pattern कहा जाता इस्तेमाल किया है।

+0

सुनिश्चित नहीं है कि यह आपके लिए उपयोगी होगा लेकिन यहां: http://stackoverflow.com/questions/3356503/automated-testing-openxml-sdk –

उत्तर

3

यदि आप इसे नकल नहीं कर सकते हैं और छोटे से छोटे नहीं बना सकते हैं, तो इसे उच्च स्तर पर ले जाना और परिदृश्य परीक्षण करना बेहतर हो सकता है। परीक्षण के लिए सेटअप बनाने के लिए आप [testInitialize] और [TestCleanup] विधियों का उपयोग कर सकते हैं।

Pex and Moles का उपयोग करके इसे परीक्षण करने का एक और तरीका हो सकता है।