2008-09-24 15 views
5

क्या किसी को कार्यालय के लिए प्रबंधित एप्लिकेशन ऐड-इन इकाई परीक्षण के लिए कोई सुझाव मिला है? मैं न्यूटिट का उपयोग कर रहा हूं लेकिन मुझे एमएसटीएस्ट के साथ एक ही समस्या थी।माइक्रोसॉफ्ट ऑफिस के लिए .NET एड-इन का यूनिट परीक्षण

समस्या यह है कि Office अनुप्रयोग (मेरे मामले में, Word) के अंदर लोड की गई .NET असेंबली है और मुझे .NET असेंबली के उस उदाहरण के संदर्भ की आवश्यकता है। मैं ऑब्जेक्ट को तुरंत चालू नहीं कर सकता क्योंकि इसमें शब्द करने के लिए शब्द का उदाहरण नहीं होगा।

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

COM ऑब्जेक्ट (एक VB.NET वर्ग) वास्तव में असली ऐड-इन के उदाहरण के लिए एक संदर्भ है, लेकिन मैं सिर्फ NUnit करने के लिए कि वापसी करने की कोशिश की और मैं एक अच्छा पी/आह्वान त्रुटि मिली:

System.Runtime.Remoting.RemotingException: इस रिमोटिंग प्रॉक्सी में कोई चैनल सिंक नहीं है जिसका अर्थ है कि सर्वर के पास कोई पंजीकृत सर्वर चैनल नहीं है जो सुन रहा है, या इस एप्लिकेशन के पास सर्वर से बात करने के लिए कोई उपयुक्त क्लाइंट चैनल नहीं है। System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke (IMethodCallMessage reqMcmMsg, बूलियन useDispatchMessage, Int32 CALLTYPE) System.Runtime.Remoting.Proxies.RemotingProxy.Invoke पर (iMessage reqMsg) System.Runtime.Remoting.Proxies पर पर । RealProxy.PrivateInvoke (MessageData & msgData, Int32 प्रकार)

मैं मुख्य ऐड-इन कॉम दृश्यमान बनाने की कोशिश की और त्रुटि परिवर्तन:

System.InvalidOperationException: ऑपरेशन वस्तु की वर्तमान स्थिति की वजह से मान्य नहीं है । System.RuntimeType.ForwardCallToInvokeMember (स्ट्रिंग MemberName, BindingFlags झंडे, वस्तु लक्ष्य, Int32 [] aWrapperTypes, MessageData & msgData) पर

जब मैं एक है काम के आसपास है, यह गंदा है और वास्तविक परियोजना में परीक्षण कोड के बहुत सारे डालता है परीक्षण परियोजना के बजाय - जो वास्तव में काम करने के लिए एनयूनीट का मतलब नहीं है।

उत्तर

2

इस तरह मैंने इसे हल किया।

  1. यूआई में बटन के क्लिक विधि से मेरे ऐड-इन रनों में बस सब कुछ के बारे में बस। मैंने उन सभी क्लिक विधियों को केवल सरल, पैरामीटर रहित कॉल को शामिल करने के लिए बदल दिया है।

  2. मैंने फिर एंट्रीपॉइंट नामक एक नई फ़ाइल (आंशिक कक्षा) बनाई, जिसमें बहुत कम मित्र मित्र थे, जिनमें से प्रत्येक आमतौर पर पैरामीटरयुक्त कार्यकर्ताओं के कार्यों में एक या दो कॉल था, ताकि सभी क्लिक विधियों को अभी इसमें बुलाया जा सके फ़ाइल। इसलिए, उदाहरण के लिए, एक ऐसा फ़ंक्शन है जो एक मानक दस्तावेज़ खोलता है और हमारे डीएमएस में "सेव" के रूप में कॉल करता है। फ़ंक्शन किस दस्तावेज़ को खोलने का पैरामीटर लेता है, और हमारे द्वारा उपयोग किए जाने वाले दो दर्जन मानक दस्तावेज़ हैं।

तो मैं

Private Sub btnMemo_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) Handles btnMemo.Click 
    DocMemo() 
End Sub 
ThisAddin में

और फिर

Friend Sub DocMemo() 
    OpenDocByNumber("Prec", 8862, 1) 
End Sub 
मेरी नई EntryPoints फ़ाइल में

है।

  1. मैं जो

    सार्वजनिक इंटरफ़ेस IAddInUtilities

#If DEBUG Then

Sub DocMemo() 

#End If

है एक नया AddInUtilities फ़ाइल जोड़ने 210

#If DEBUG Then

Public Sub DocMemo() Implements IAddInUtilities.DocMemo 
    Addin.DocMemo() 
End Sub 

#End If

Friend Sub New(ByRef theAddin as ThisAddIn) 
    Addin=theAddin 
End Sub 
End Class 
  1. मैं ThisAddIn फाइल करने के लिए जाने के लिए और

    निजी उपयोगिताओं में जोड़ने AddInUtilities रूप

    संरक्षित ओवरराइड मज़ा ction RequestComAddInAutomationService() वस्तु के रूप में उपयोगिताओं कुछ भी नहीं कर रही है तो उपयोगिताओं = नई AddInUtilities (Me) तो अंत वापसी उपयोगिताओं समाप्ति समारोह

और अब इसे प्रयोग EntryPoints में DocMemo() फंक्शन का परीक्षण किया जा सकता है NUnit, कुछ इस तरह:

<TestFixture()> Public Class Numbering 

Private appWord As Word.Application 
Private objMacros As Object 

<TestFixtureSetUp()> Public Sub LaunchWord() 
    appWord = New Word.Application 
    appWord.Visible = True 

    Dim AddIn As COMAddIn = Nothing 
    Dim AddInUtilities As IAddInUtilities 
    For Each tempAddin As COMAddIn In appWord.COMAddIns 
     If tempAddin.Description = "CobbettsMacrosVsto" Then 
      AddIn = tempAddin 
     End If 
    Next 
    AddInUtilities = AddIn.Object 
    objMacros = AddInUtilities.TestObject 


End Sub 

<Test()> Public Sub DocMemo() 


    objMacros.DocMemo() 
End Sub 

<TestFixtureTearDown()> Public Sub TearDown() 
    appWord.Quit(False) 
End Sub 

End Class 

केवल एक चीज आप नहीं तो इकाई परीक्षण, वास्तविक घटनाओं क्लिक कर सकते हैं क्योंकि आप RequestComAdd के माध्यम से एक अलग तरीके से EntryPoints में कॉल कर रहे हैं, यानी ईवेंट हैंडलर के बजाए InAutomationService इंटरफ़ेस।

लेकिन यह काम करता है!

2

अपने परीक्षण में कार्यालय के व्यवहार को नकली करने के लिए विभिन्न मॉकिंग फ्रेमवर्क NMock, RhinoMocks आदि पर विचार करें।

+1

मुझे इसके लिए पूरे कार्यालय का मज़ाक उड़ा देना होगा! –

+0

@ रिचर्ड गद्देडन यूप सही है और मैंने इसे NSubstitute का उपयोग करके Excel के लिए किया है, यह अंत में कठिन नहीं था। –

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