2012-01-31 1 views
5

Sto provando a generare un evento in un'interfaccia fittizia. Posso ottenere questo in C#, ma per qualche ragione dolorosa non riesco a farlo funzionare in VB.Net. Se qualcuno potesse aiutarmi con questa situazione, lo apprezzerei. Spero di non aver perso la barca concettualmente e tutto quello che mi manca è una certa sintassi. Questo è simile al codice con cui sto lavorando:Come faccio a generare un evento usando Moq?

Public Interface ISendable 

Event SendMessage(message As String) 

End Interface 

''********** 

Public Interface IPrintable 

Sub PrintAnnouncement(announcement As String) 

End Interface 

'****** 

Public Class BulletinBoard 

Private mPrintable As IPrintable 

Public Sub New(sendable As ISendable, printable As IPrintable) 
    AddHandler sendable.SendMessage, AddressOf GetItOut 
    mPrintable = printable 
End Sub 

Public Sub GetItOut(message As String) 
    'Do some stuff I can verify happened with Moq 
    mPrintable.PrintAnnouncement(message) 
End Sub 
End Class 

speravo di ottenere un test che sembrava una cosa come questa in esecuzione:

Imports NUnit.Framework 
Imports Moq 

<TestFixture()> _ 
Public Class SendMessageTests 

<Test()> _ 
Public Sub canRaiseEvent() 
    Dim announcement As String = "What the?" 
    Dim sendable As New Mock(Of ISendable)() 
    Dim printable As New Mock(Of IPrintable)() 

    Dim bb As New BulletinBoard(sendable.Object, printable.Object) 
    'What is the syntax for raising sendable's event? 
    'sendable.Raise(....?) 

    printable.Verify(Sub(d) d.PrintAnnouncement(announcement), Times.Once()) 

End Sub 

End Class 

Qualcuno mi può aiutare a completare o correggere la linea nella mia classe di test che inizia "sendable.Raise ..."? Forse c'è più setup che devo fare, ma il sito Moq non sembra indicare questo è il caso.

Grazie in anticipo.

risposta

5

Con questa formazione il test è verde:

sendable.Raise(Sub(e) AddHandler e.SendMessage, AddressOf MockHandler, announcement) 

è necessario anche per creare un gestore di eventi "finto" per farlo funzionare:

Sub MockHandler() 

End Sub 

EDIT:

I' Non sono un VB guy, quindi non c'è una sintassi più breve con l'utilizzo di un metodo anonimo inline invece di MockHandler: :

sendable.Raise(Sub(e) AddHandler e.SendMessage, Function() vbEmpty, announcement) 
+0

Eccellente, nemesv: proprio quello che cercavo. Grazie per aver risposto così velocemente. – RobC