我正在使用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。
答案 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());
希望能解释您的问题的原因,并有助于解决:)。