2012-07-24 20 views
6

मैं माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल.रेंज (और अन्य माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल इंटरफेस) को यूनिट करने के लिए यूनिट करना चाहता हूं। मैं Moq 4.0.10827 का उपयोग कर रहा हूं .NET 4 में सी #। इस प्रकार, मैं रेंज का उपयोग कर रहामाइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल.कॉक मॉक के साथ रेंज कैसे करें?

 var range = new Mock<Microsoft.Office.Interop.Excel.Range>(); 
     range.Setup(r => r.get_Value(1)).Returns("Something"); 

     var classBeingTested = new MyClass(range.Object); 

कोड में इकाई का परीक्षण किया जा रहा है:

मेरी इकाई परीक्षण में, मैं इस प्रकार नकली के व्यवहार की स्थापना करने का प्रयास

public MyClass(Range range) 
    { 
     var value = range[1].ToString(); 
    } 

 Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'. 

मैं इस mockin कैसे लागू कर सकते हैं:

जब परीक्षण चलता है, यह निम्न अपवाद पैदा करता है जी सफलतापूर्वक? मुझे एहसास है कि https://stackoverflow.com/a/9486226/1548950 जैसे पैटर्न के साथ एक्सेल इंटरऑप कार्यक्षमता को अलग करना एक संभावित समाधान है; हालांकि, मैं माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल इंटरफेस से मैक्स बनाने में सक्षम होने के साथ खुश रहूंगा।

संपादित करें: इस मुद्दे

ठीक पर अधिक जानकारी, यह अजीब है। मैंने jimmy_keen द्वारा सुझाव का परीक्षण करने के लिए एक प्रोजेक्ट बनाया है। यह काम करता हैं।

Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'. 

के बाद से jimmy_keen के सुझाव अन्य परियोजनाओं पर ठीक काम किया है, मैं शक कुछ के साथ कुछ गड़बड़ है शुरू कर दिया: हालांकि, जब मैं एक ही सुझाव का उपयोग परियोजना मैं, साथ मुद्दों था परीक्षण करने के लिए यह निम्न अपवाद फेंकता प्रोजेक्ट मैं कोड का परीक्षण कर रहा हूं। http://www7.zippyshare.com/v/70834394/file.html

समस्या के मूल होने के लिए है कि परियोजना के अन्य वर्ग अनिवार्य रूप से निम्न कोड के साथ (है कि इकाई परीक्षण नहीं किया जा रहा है) शामिल हैं लगता है::

तो, मैं एक परीक्षण समाधान है कि विस्तार से समस्या को दर्शाता है बनाया
using Microsoft.Office.Interop.Excel; 
namespace Project 
{ 
    public class UnTestedClass 
    { 
     public UnTestedClass(Worksheet sheet) 
     { 
      var foo = sheet.Range["Description"].Column; 
     } 
    } 
} 

मुझे समझ में नहीं आता कि यह समस्या क्यों पैदा करता है, क्योंकि मैं इकाई परीक्षण में UnTestedClass का उपयोग नहीं कर रहा हूं। क्या मुझे कुछ याद आ रहा है कि मुझे मोक का उपयोग कैसे करना चाहिए, या क्या मैंने एक बग पर ठोकर खाई है?

+0

+1 यह अजीब बात है, मुझे लगता है कि इसमें COM ऑब्जेक्ट्स के साथ कुछ करना है। जैसे ही मैं एक्सेल इंटरऑप का संदर्भ देता हूं, अब मैं अपने Moq लाइब्रेरी का संदर्भ नहीं दे सकता ... अजीब ... – jsmith

+0

इस पर कुछ काम करने के बाद, अब मैं माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल कार्यक्षमता को अलग करने की दिशा में आगे बढ़ रहा हूं माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल। * सीधे मजाक करने के बजाय कस्टम क्लासेस और इंटरफेस। हालांकि इस प्रश्न का उत्तर तत्काल मुद्दों को हल करता है, माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल का मज़ाक उड़ाता है। * आखिरकार इसे उपयोगी बनाने के लिए बहुत अधिक सेटअप कार्य की आवश्यकता शुरू हुई। –

उत्तर

5

आपका कोड इंडेक्सर तक पहुँचता है, और है कि क्या आपका उपहास करने की जरूरत है:

var range = new Mock<Microsoft.Office.Interop.Excel.Range>(); 
range.Setup(r => r[1, It.IsAny<object>()]).Returns("something"); 

ध्यान दें कि Range इंडेक्सर वास्तव में दो पैरामीटर लेता है - कॉल में इसलिए It.IsAny<object>() बाधा।

+0

धन्यवाद, मैंने इसका परीक्षण किया और यह कुछ मामलों में काम करता है। हालांकि, यूनिट टेस्ट जो मैं अभी भी काम कर रहा हूं, काम करने से इंकार कर रहा हूं। कृपया परीक्षण समाधान देखें जिसे मैंने http://www7.zippyshare.com/v/70834394/file.html –

+2

@LauriHarpf पर अपलोड किया है: यह दिलचस्प है। जाहिर है यह कंपाइलर जेनरेट कोड के साथ एक "मुद्दा" है।आपके * प्रोजेक्ट * में कंपाइलर द्वारा उत्पन्न 'रेंज' प्रकार इंटरफ़ेस में अतिरिक्त संपत्ति ('कॉलम', अर्थात्) है। मुझे कोई संकेत नहीं है कि यह कैसल के लिए समस्याग्रस्त कैसे हो सकता है ... लेकिन यह COM है। उदाहरण के लिए यदि आप ILSpy के साथ अपनी असेंबली जांच लेंगे, तो आप देखेंगे कि मेरा क्या मतलब है। कंपाइलर जेनरेट कोड अलग है (यहां तक ​​कि कक्षाएं समान हैं) और यह समस्या होनी चाहिए। ध्यान दें कि यदि आप 'range.Setup (r => r.Column) stuburns (0); 'यह परीक्षण भी पास होगा। –

+1

उत्कृष्ट, धन्यवाद! ILSpy टिप सुनहरा भी था; मेरे असली प्रोजेक्ट में, मुझे कॉलम के अतिरिक्त दिखाई देने वाली अन्य अतिरिक्त संपत्तियां दिखाई देती हैं। वर्तमान "कॉलम", "कॉलम", "पंक्ति", "पंक्तियां" और "मान" हैं। यह व्यवहार शायद किसी यूनिट परीक्षण को मैं बहुत भंगुर लिखूंगा, क्योंकि किसी भी समय नई संपत्तियां दिखाई दे सकती हैं और कुछ तोड़ सकती हैं .. किसी भी मामले में, अपनी युक्तियों का उपयोग करके और सावधानी से यह काम करने वाली सभी अतिरिक्त संपत्तियों का मज़ाक उड़ाते हुए, जवाब के रूप में चिह्नित किया जाता है। धन्यवाद महोदय! –