2010-09-26 9 views
5

Sto cercando di utilizzare la sintassi AAA in Rhino Mocks con VB.Net per convalidare che un metodo è stato chiamato una sola volta. Non riesco a farlo bene. Con questo codice, se il repository viene chiamato due volte, non restituisce nulla sulla seconda chiamata e il test passa. Mi sarei aspettato che il test fallisse quando VerifyAllExpectations è stato chiamato.Rhino Mocks: Come verificare che un metodo sia stato chiamato esattamente una volta usando la sintassi vb.net e AAA

<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 
+0

Sei usando VS2008 o VS2010 con vb? –

+0

Utilizzo Visual Studio 2010 come target del framework 4.0 per il mio progetto di test e il targeting del framework 3.5 per il progetto che sto testando. –

risposta

4

Se si sta usando VS2010 si ottiene much improved lamba support (tra cui una migliore esperienza con Rhino Mocks con VB)

delineare come utilizzare la sintassi AAA w/Rhino prende in giro here (utilizzando C#), ma per rispondere alla tua domanda in fretta che si possa fare la seguente

012.351.

prima della classe che si desidera verificare alcuni comportamenti interattivi (super semplice ma funziona)

Public Class Class1 
    Public Overridable Sub Happy() 

    End Sub 

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

successivo alla prova scritta utilizzando AAA + VB per dimostrare il metodo Felice viene chiamato 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

Grazie Toran. Avevo provato prima questo approccio, ma avevo un errore del compilatore nell'istruzione AssertWasCalled. Supponevo di aver bisogno di chiamarlo con AssertWasCalled (function (x) ... perché il metodo che stavo affermando era una funzione. Passare ad AssertWasCalled (Sub (x) ... consente al codice di funzionare. –

+0

Nessun problema - Sono contento di poterti aiutare, ho fatto molti test con vb e mi sono sentito come se fossi l'unico a farlo (aiuto zero per domande più complesse come questa) –

-1

Dal AssertWasCalled non è compatibile con VB ho la seguente soluzione (brutto) con il codice di demo per voi

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