Rhino Mocks: Как проверить, что метод был вызван ровно один раз с использованием синтаксиса vb.net и AAA - PullRequest
5 голосов
/ 26 сентября 2010

Я пытаюсь использовать синтаксис AAA в Rhino Mocks с VB.Net, чтобы проверить, что метод вызывался только один раз.Я не могу понять это правильно.С этим кодом, если хранилище вызывается дважды, он ничего не возвращает при втором вызове, и тест проходит.Я ожидал, что тест не пройдёт при вызове VerifyAllExpectations.

<TestMethod()>
Public Sub GetDataCallsRepositoryOneTime()
    Dim repository As IDataRepository = MockRepository.GenerateMock(Of IDataRepository)()
    Dim cacheRepository As New CachingDataRepository(repository)
    Dim results1 As IEnumerable(Of DataItem)
    Dim results2 As IEnumerable(Of DataItem)

    'verify that the base repository was asked for its data one time only
    repository.Expect(Function(x) x.GetData(1)).Return(GetSampleData).Repeat.Once()

    results1 = cacheRepository.GetData(1)
    results2 = cacheRepository.GetData(1)

    sdr.VerifyAllExpectations()
End Sub

Ответы [ 2 ]

4 голосов
/ 03 октября 2010

Если вы используете VS2010, вы получаете значительно улучшенную поддержку ламбы (включая гораздо лучший опыт использования Rhino Mocks с VB)

Я обрисовал в общих чертах, как использовать синтаксис AAA с насмешками на носорогов здесь (используя c #), но чтобы быстро ответить на ваш вопрос, вы могли бы сделать следующее

Сначала вы хотите проверить интерактивное поведение класса (очень просто, но это работает)

Public Class Class1
    Public Overridable Sub Happy()

    End Sub

    Public Overridable Sub DoIt()
        Me.Happy()
        Me.Happy()
    End Sub
End Class

Затем тест, написанный с использованием AAA + vb, чтобы доказать, что метод Happy, называется 2x

<TestClass()>
Public Class UnitTest2

    <TestMethod()>
    Public Sub TestMethod1()
        Dim x = MockRepository.GeneratePartialMock(Of Class1)()

        x.DoIt()

        x.AssertWasCalled(Sub(y) y.Happy(), Sub(z) z.Repeat.Times(2))
    End Sub

End Class
0 голосов
/ 27 сентября 2010

Поскольку AssertWasCalled не совместим с VB, у меня есть следующее (некрасивое) решение с демонстрационным кодом для вас

Public Interface datarepository
    Function GetData(ByVal id As Integer) As IEnumerable(Of String)
End Interface

Public Class cacherepository
    Dim _datarepository As datarepository
    Dim results As New Dictionary(Of Integer, IEnumerable(Of String))

    Public Sub New(ByVal datarepository As datarepository)
        _datarepository = Datarepository
    End Sub

    Public Function GetData(ByVal id As Integer) As IEnumerable(Of String)
        Dim result As New List(Of String)
        If results.TryGetValue(id, result) = False Then
            result = _datarepository.GetData(id)
            'Uncomment the following line to make the test pass'
            'results.Add(id, result)'
        End If
        GetData = result
    End Function
End Class

<TestClass()>
Public Class UnitTest1

    <TestMethod()>
    Public Sub TestMethod1()
        Dim datarep As datarepository = MockRepository.GenerateMock(Of datarepository)()
        Dim cacherep = New cacherepository(datarep)
        cacherep.GetData(1)
        datarep.Expect(Function(x) x.GetData(1)).Throw(New ApplicationException("FAILED TEST"))
        Try
            cacherep.GetData(1)
        Catch ex As ApplicationException
            Assert.Fail("GetData is called more than once")
        End Try
    End Sub

End Class
...