2008-11-12 2 views
3

VB 6.0으로 작성된 COM 라이브러리에 대한 테스트를 작성합니다. 우리가 직면 한 문제는 VB에서 선언 된 이벤트에 액세스 할 수 없다는 것입니다. 우리는 예외적으로 "객체는 일련의 이벤트를 지원하지 않습니다". 우리는 어떻게이 문제를 극복 할 수 있습니까?Visual Basic 6.0에서 dotnet 응용 프로그램에 선언 된 이벤트를 사용하여

+0

몇 가지 예제 코드를 제공해 주시겠습니까? 우리는 여러 번 문제없이이 작업을 여러 번했습니다. – Ant

답변

1

예를 들어 VB 6.0에는 DatabaseCommand라는 클래스가 있습니다.

Option Explicit 

Public Event SavedSuccessfully() 

Public Sub Execute(ByVal vAge As Integer, ByVal vName As String, ByVal vAddress As String) 

    RaiseEvent SavedSuccessfully 

End Sub 
이제

, personclass

Private WithEvents dbCommand As DatabaseCommand 

Public Sub Init(ByVal vDBCommand As DatabaseCommand) 

    Set dbCommand = vDBCommand 

End Sub 

Private Sub dbCommand_SavedSuccessfully() 
    'not implemented 
End Sub 

지금, 시도합니다 (VB 프로젝트를 컴파일 한 후)이를 테스트 할 때

MockRepository repository = new MockRepository(); 

PersonLib.DatabaseCommand db = repository.DynamicMock<PersonLib.DatabaseCommand>(); 

PersonLib.PersonClass person = new PersonLib.PersonClass(); 

person.Init(db); --- this line throws error - Object or class does not support the set of events 
3

귀하의 조롱 프레임 워크는 여기에 문제가 있습니다. 이 호출에 의해 반환되는 모의 객체 :

repository.DynamicMock<PersonLib.DatabaseCommand>(); 

DatabaseCommand 클래스의 인터페이스를 구현하지만, 해당 이벤트를 조롱하지 않습니다. 따라서 이벤트를 발생시킬 수있는 DatabaseCommand 객체를 수신 할 것으로 예상되는 VB6 코드에이 모의 객체의 인스턴스를 전달하면 작동하지 않습니다. 무슨 일이 일어나고 있는지

당신이 당신의 PersonClass.Init 방법에 모의 개체를 전달

, 여기에 단순화 된 버전 :

  1. 코드는 PersonClass.Init이 라인에 가져옵니다

    Set dbCommand = vDBCommand

  2. VB6는 DatabaseCommand 클래스와 동일한 이벤트를 지원하는 경우 Set 문의 오른쪽에있는 개체를 요청합니다 (VB6에서는이 작업을 수행하므로 사용자가 d dbCommandWithEvents 키워드와 함께 사용하므로 dbCommand 개체에서 이벤트를 수신하도록 이벤트 싱크를 설정하려고 시도합니다.

  3. 그러나 전달 된 객체는 모의 객체이며 실제 DatabaseCommand 객체가 아니며 실제 DatabaseCommand 클래스가 구현하는 이벤트를 실제로 구현하지 않습니다. VB6에서이 문제가 발생하면보고있는 오류가 발생합니다.

나는 모의 객체가 DatabaseCommand 클래스는 테스트 코드 작업을 (물론, 내가 한 가지 방법을 생각할 수 있도록 순서에서와 같은 이벤트를 지원 할 수있는 방법을 생각할 수 없다, 그러나 포함 할

귀하의 수업을 재 설계), 더 합리적인 해결책을 찾으면 나중에 게시 할 수 있습니다.

+0

안녕하세요, 몇 가지 대체 솔루션을 게시 할 수 있다면 좋을 것입니다. –