2008-11-12 7 views
3

nous écrivons des tests pour une bibliothèque COM écrite en VB 6.0. Le problème auquel nous sommes confrontés est que nous ne pouvons pas accéder aux événements déclarés dans VB (avec des événements). Nous obtenons une exception, "l'objet ne supporte pas l'ensemble des événements". Comment pouvons-nous surmonter ce problème?En utilisant les événements déclarés dans Visual Basic 6.0 dans une application dotnet

+0

Pouvez-vous nous donner un exemple de code? Nous l'avons fait sans problème un certain nombre de fois. – Ant

Répondre

1

Par exemple, nous avons une classe en VB 6.0 appelée 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 

Maintenant, 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 

Maintenant, lorsque vous essayez de tester ce (après la compilation du projet 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

Votre cadre moqueur est le problème ici. L'objet fantaisie retourné par cet appel:

repository.DynamicMock<PersonLib.DatabaseCommand>(); 

implémente l'interface de la classe DatabaseCommand, mais ne moque pas de ses événements. Par conséquent, lorsque vous passez une instance de cet objet maquette à votre code VB6, qui s'attend à recevoir un objet DatabaseCommand pouvant déclencher des événements, cela ne fonctionnera pas.

Lorsque vous passez l'objet fantaisie à votre méthode PersonClass.Init, version ici est simplifiée de ce qui se passe:

  1. Le code arrive à cette ligne dans PersonClass.Init:

    Set dbCommand = vDBCommand

  2. VB6 demande à l'objet sur le côté droit de l'instruction Set s'il prend en charge les mêmes événements que la classe DatabaseCommand (VB6 le fait car vous déclarez d dbCommand avec le mot-clé WithEvents, il va donc essayer de configurer un récepteur d'événements pour recevoir des événements de l'objet dbCommand). L'objet que vous avez transmis, cependant, étant un objet factice et non un objet réel DatabaseCommand, n'implémente pas réellement les événements que la classe DatabaseCommand réelle implémente. Lorsque VB6 rencontre cela, cela soulève l'erreur que vous voyez.

Je ne peux pas penser à une façon de faire l'objet fantaisie soutenir les mêmes événements que la classe DatabaseCommand fait dans l'ordre faire (bien votre travail code de test, je peux penser à une façon, mais cela impliquerait redesigning vos classes), mais je peux poster plus plus tard si je trouve une solution plus raisonnable.

+0

Bonjour, Si vous pouviez poster une autre solution, ce serait génial. –

Questions connexes