我们正在为用VB 6.0编写的COM库编写测试。我们面临的问题是,我们无法访问VB中声明的事件(withevents)。我们得到例外,“对象不支持事件集”。我们怎样才能克服这个问题?
答案 0 :(得分:3)
你的模拟框架就是问题所在。此调用返回的模拟对象:
repository.DynamicMock<PersonLib.DatabaseCommand>();
实现DatabaseCommand
类的接口,但不模拟其事件。因此,当您将此模拟对象的实例传递给您希望接收可以引发事件的DatabaseCommand对象的VB6代码时,它将无法工作。
当您将模拟对象传递给PersonClass.Init
方法时,这里是正在发生的事情的简化版本:
代码到达PersonClass.Init
中的这一行:
Set dbCommand = vDBCommand
VB6询问Set
语句右侧的对象是否支持DatabaseCommand
类所执行的相同事件(VB6这样做是因为您声明了dbCommand
使用WithEvents
关键字,因此它会尝试设置事件接收器以接收来自dbCommand
对象的事件。
但是,传入的对象是模拟对象而不是真正的DatabaseCommand
对象,实际上并不实现真实DatabaseCommand
类实现的事件。当VB6遇到这种情况时,会引发您看到的错误。
我想不出一种方法可以让模拟对象支持DatabaseCommand
类所做的相同事件,以使你的测试代码工作(好吧,我可以想到一种方法,但它会涉及重新设计你的课程),但如果我找到更合理的解决方案,我可能会稍后发布。
答案 1 :(得分: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
现在,人类
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