1

我正在使用 Rhino Mocks 编写我的单元测试,并且我想使用Assert.WasCalled功能,但我一直收到错误消息。

一堆测试使用的我的帮助方法:

Private Function CreateSecurityTicketHelper(userName As String, validFrom As DateTime, validTo As DateTime) As ISecurityTicket
    ' Prepare a mock object for ITicketingDataManager interface
    Dim dataManagerMock = MockRepository.GenerateMock(Of ITicketingDataManager)()
    ' Prepare a mock function for ITicketingDataManager.InitializeNewTicket(string, string)
    Dim returnSecurityTicket As Func(Of String, String, ISecurityTicket) = Function(u, k) New SecurityTicketEntity() With {.UserName = u, .Key = k}
    dataManagerMock.Stub(Function(x) x.InitializeNewTicket(Nothing, Nothing)).IgnoreArguments().Do(returnSecurityTicket)

    ' Create new TicketingManager instance
    Dim ticketingManager = New TicketingManager(dataManagerMock)
    ' Try creating new security ticket
    Dim ticket = ticketingManager.CreateSecurityTicket(userName, validFrom, validTo)

    ' Check if proper ITicketingDataManager method was invoked
    dataManagerMock.AssertWasCalled(Sub(x) x.InitializeNewTicket(Nothing, Nothing), Sub(z) z.Repeat.Once())

    ' Return the ticket
    Return ticketingManager.CreateSecurityTicket(userName, validFrom, validTo)
End Function

我可以调试该方法并且一切正常,直到AssertWasCalled调用方法,当我得到以下异常时:

测试方法 Authentication.UnitTests.TicketingManagerTests.CreateSecurityTicket_ValidUserNameAndKey_TicketIsCreated 抛出异常:Rhino.Mocks.Exceptions.ExpectationViolationException: ITicketingDataManager.InitializeNewTicket(null, null); 预期 #1,实际 #0。

4

1 回答 1

2

您的断言说该InitializeNewTicket()方法应该使用 arguments 调用一次(Nothing, Nothing)

如果使用其他参数调用此方法,则断言失败。

您必须将断言重写为 A) 接受任何参数或 B) 指定正确的参数

请参阅下面的示例。
关于示例的几点说明:
1. 不幸的是,我不擅长 VB 语法,所以在 C# 中提供示例。
2. 没有提到哪个参数类型有方法InitializeNewTicket(),所以例如我假设它有String参数。

接受断言中的任何参数:

dataManagerMock.AssertWasCalled(
    x => x.InitializeNewTicket(Arg<String>.Is.Anything, Arg<String>.Is.Anything),
    z => z.Repeat.Once());

要指定预期的参数(例如expected1, expected2):

dataManagerMock.AssertWasCalled(
    x => x.InitializeNewTicket(Arg<String>.Is.Equal(expected1), Arg<String>.Is.Equal(expected2)),
    z => z.Repeat.Once());

希望能解释您的问题的原因并有助于解决:)。

于 2013-01-12T09:41:32.923 回答