如何使用Moq引发事件?

7

我正在尝试在模拟接口中引发事件。在C#中,我可以做到这一点,但是出于某些麻烦的原因,我无法在VB.Net中使其工作。如果有人能帮助我解决这个问题,我将不胜感激。希望我没有在概念上错过什么,我所缺少的只是一些语法。以下是我正在使用的类似代码:

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

我希望能够运行类似于这样的测试:

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

有人能帮我完成或纠正测试类中以“sendable.Raise…”开头的行吗?也许我需要做更多的设置,但Moq网站似乎没有表明这是必须的。

提前感谢。

1个回答

7

使用这行代码,你的测试将变为绿色:

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

你还需要创建一个“模拟”事件处理程序来使其工作:
Sub MockHandler()

End Sub

编辑:

我不是VB人,所以似乎使用内联匿名方法比MockHandler语法更简短:

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

太好了,nemesv——正是我想要的。感谢您如此迅速地回答。 - RobC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接