2013-01-11 32 views
1

我正在使用Rhino Mocks编写我的单元测试,我想使用Assert.WasCalled功能,但我一直在收到错误。通过一系列测试使用z.Repeat.Once无法正常工作

我的帮助方法:

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。

回答

2

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

如果用调用另一个参数调用此方法,则断言失败。

您必须重写断言要么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()); 

希望,说明您的问题的原因,并帮助解决:)。

+0

太棒了!非常感谢 :) – MarcinJuraszek