문제

사무실에 대한 관리 응용 프로그램 애드 인을 테스트하는 단위 테스트에 대한 제안이 있습니까? 나는 nunit을 사용하고 있지만 MStest와 같은 문제가있었습니다.

문제는 사무실 애플리케이션 내에 .NET 어셈블리가로드된다는 것입니다 (내 경우 단어). .NET 어셈블리의 인스턴스에 대한 참조가 필요하다는 것입니다. 나는 그 객체를 인스턴스화 할 수 없습니다. 그런 다음 일을 할 단어의 인스턴스가 없기 때문입니다.

이제 Application.comAddins ( "AddIn의 이름")을 사용하여 객체 인터페이스를 사용하여 참조를 얻을 수 있지만 요청 ComadDinaUtomationService를 통해 반환되는 COM 객체가됩니다. 지금까지 내 솔루션은 해당 객체가 테스트하려는 실제 .NET 객체의 모든 방법에 대한 프록시 메소드를 갖는 것입니다 (조건부 컴파일 하에서 설정하여 릴리스 버전에서 사라짐).

COM 객체 (vb.net 클래스)는 실제로 실제 추가 인 인스턴스에 대한 참조를 가지고 있지만 Nunit으로 반환하려고 시도했지만 멋진 p/invoke 오류가 발생했습니다.

System.Runtime.REMOTING.REMOTINGEXCEPTION :이 원격 프록시에는 채널 싱크가 없으므로 서버에 청취중인 등록 된 서버 채널이 없거나이 응용 프로그램에 적합한 클라이언트 채널이 없음을 의미합니다. at System.Runtime.Remoting.proxies.RemotingProxy.internalInvoke (ImethodCallMessage reqmcmmsg, boolean usedispatchmessage, int32 calltype) at System.Runtime.Runtime.REMOTING.REMOTING.REMOTIGE.REMSG) AT SYSTEM.RUMMSG) AT SYSTEM.RUTINE.RIPORITINGEMOTION. (MessageData & Msgdata, int32 유형)

메인 애드 인 COM을 보이도록 시도하고 오류가 변경되었습니다.

System.InvalidOperationException : 객체의 현재 상태로 인해 작동이 유효하지 않습니다. at system.runtimeType.forwardCalltoInvokemember (String membername, bindingflags flags, 객체 대상, int32 [] awrapperTypes, messagedata & msgdata)

나는 해결 방법을 가지고 있지만, 그것은 지저분하고 테스트 프로젝트 대신 실제 프로젝트에 많은 테스트 코드를 넣습니다. 이것은 실제로 Nunit이 작동하는 방식이 아닙니다.

도움이 되었습니까?

해결책

이것이 내가 해결 한 방법입니다.

  1. 내 추가 기능의 거의 모든 것이 UI의 버튼 클릭 메소드에서 실행됩니다. 나는 모든 클릭 방법을 간단한 매개 변수가없는 호출로만 구성하도록 변경했습니다.

  2. 그런 다음 매우 짧은 친구 서브가 많은 EntryPoint라는 새 파일 (부분 클래스)을 만들었습니다. 각각은 일반적으로 매개 변수화 된 작업자 기능에 대한 하나 또는 두 개의 호출이므로 모든 클릭 방법 이이 파일로 호출되었습니다. 예를 들어, 표준 문서를 열고 DMS에 "Save AS"를 호출하는 함수가 있습니다. 이 기능은 문서를 열어야하는 매개 변수를 사용하며 우리가 사용하는 12 개의 표준 문서가 있습니다.

그래서 나는 가지고있다

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 파일로 가서 추가합니다

    추가 기능으로서의 개인 유틸리티

    Protected는 기능 요청 ComadDinautomationService ()를 객체로 객체로 사용하지 않으면 유틸리티가 없으면 유틸리티 = 새로운 부가성 (ME) 종료되면 return 유틸리티 종료 기능

이제 Nunit을 사용하여 EntryPoints에서 Docmemo () 함수를 다음과 같이 테스트 할 수 있습니다.

<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

단위 테스트는 실제 클릭 이벤트입니다. 실제 클릭 이벤트입니다. 즉, 이벤트 핸들러가 아닌 requestComadDinaUtomationService 인터페이스를 통해 다른 방식으로 항목을 호출하기 때문입니다.

그러나 그것은 작동합니다!

다른 팁

다양한 조롱 프레임 워크를 고려하십시오 Nmock, 코뿔소, 시험에서 사무실의 행동을 가짜 등.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top