z.Repeat.Once不工作

时间:2013-01-11 13:45:00

标签: vb.net unit-testing mocking rhino-mocks

我正在使用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。

1 个答案:

答案 0 :(得分:2)

你的断言说InitializeNewTicket()方法应该用参数(Nothing, Nothing)调用一次。

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

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

见下面的例子 关于例子的几点注意事项:
不幸的是,我不擅长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());

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