اختبار الوحدة للوظيفة الإضافية .NET لـ Microsoft Office

StackOverflow https://stackoverflow.com/questions/126526

  •  02-07-2019
  •  | 
  •  

سؤال

هل حصل أي شخص على أي اقتراحات لوحدة اختبار الوظيفة الإضافية للتطبيق المُدار لـ Office؟أنا أستخدم NUnit ولكن واجهت نفس المشكلات مع MSTest.

تكمن المشكلة في وجود تجميع .NET تم تحميله داخل تطبيق Office (في حالتي، Word) وأحتاج إلى مرجع إلى هذا المثيل لتجميع .NET.لا يمكنني فقط إنشاء مثيل للكائن لأنه لن يكون لديه مثيل لـ Word للقيام بالأشياء به.

الآن، يمكنني استخدام واجهة Application.COMAddIns("Name of addin").Object للحصول على مرجع، ولكن ذلك يمنحني كائن COM الذي يتم إرجاعه من خلال RequestComAddInAutomationService.الحل الذي أقترحه حتى الآن هو أن يكون لهذا الكائن أساليب وكيل لكل طريقة في كائن .NET الحقيقي الذي أريد اختباره (كل ذلك تم تعيينه ضمن التجميع الشرطي بحيث تختفي في الإصدار الذي تم إصداره).

يحتوي كائن COM (فئة VB.NET) في الواقع على إشارة إلى مثيل الوظيفة الإضافية الحقيقية، لكنني حاولت فقط إرجاع ذلك إلى NUnit وحصلت على خطأ p/Invention لطيف:

System.Runtime.Remoting.RemotingException :لا يحتوي هذا الوكيل البعيد على مصدر قناة مما يعني إما أن الخادم لا يحتوي على قنوات خادم مسجلة تستمع، أو أن هذا التطبيق لا يحتوي على قناة عميل مناسبة للتحدث مع الخادم.في system.runtime.remoting.proxies.remotingproxy.internalinvoke (ImethodCallMessage reqmcmmsg ، boolean ediaspatchmessage ، int32 calltype) at system.runtime.remoting.proxies.remotingproxy.invoke Roxy.PrivinInvoke (Messagedata & msgdata ، int32 type)

لقد حاولت جعل الوظيفة الإضافية الرئيسية COM مرئية ويتغير الخطأ:

System.InvalidOperationException :العملية غير صالحة بسبب الحالة الحالية للكائن.في System.RuntimeType.ForwardCallToInvocMember (اسم عضو السلسلة، إشارات BindingFlags، هدف الكائن، Int32 [] aWrapperTypes،MessageData & msgData)

بينما لدي حل بديل، فهو فوضوي ويضع الكثير من أكواد الاختبار في المشروع الحقيقي بدلاً من المشروع الاختباري - وهي ليست الطريقة التي من المفترض أن تعمل بها NUnit.

هل كانت مفيدة؟

المحلول

هذه هي الطريقة التي قمت بحلها.

  1. يتم تشغيل كل شيء تقريبًا في الوظيفة الإضافية الخاصة بي من خلال طريقة النقر على زر في واجهة المستخدم.لقد قمت بتغيير كل طرق النقر هذه لتتكون فقط من مكالمة بسيطة بدون معلمات.

  2. بعد ذلك قمت بإنشاء ملف جديد (فئة جزئية) يسمى EntryPoint والذي يحتوي على الكثير من Friend Subs القصيرة جدًا، كل منها كان عادةً عبارة عن استدعاء واحد أو اثنين لوظائف العامل ذات المعلمات، بحيث يتم استدعاء جميع طرق النقر للتو في هذا الملف.لذلك، على سبيل المثال، هناك وظيفة تفتح مستندًا قياسيًا وتستدعي "حفظ باسم" في DMS الخاص بنا.تأخذ الوظيفة معلمة للمستند الذي سيتم فتحه، وهناك بضع عشرات من المستندات القياسية التي نستخدمها.

لذلك أنا أملك

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. أقوم بإضافة ملف AddInUtilities جديد يحتوي على

    الواجهة العامة IAddInUtilities

#If DEBUG Then

Sub DocMemo()

#End If

End Interface


Public Class AddInUtilities
    Implements IAddInUtilities
    Private Addin as ThisAddIn

#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

    Overrides محمية وظيفة requestcomaddinautomationservice () ككائن إذا لم تكن الأدوات المساعدة لا شيء ، ثم الأدوات المساعدة = نهاية الإضافات الجديدة (ME) إذا

والآن أصبح من الممكن اختبار الدالة DocMemo() في EntryPoints باستخدام 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

الشيء الوحيد الذي لا يمكنك اختباره بعد ذلك هو أحداث النقر الفعلية، لأنك تتصل بـ EntryPoints بطريقة مختلفة، أي من خلال واجهة RequestComAddInAutomationService بدلاً من معالجات الأحداث.

لكنها تعمل!

نصائح أخرى

النظر في الأطر الساخرة المختلفة نموك, RhinoMocks, ، إلخ.لتزييف سلوك Office في اختباراتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top