2011-10-14 8 views
6

Apprezzo molto che chiunque mi può aiutare nel seguente problema: Ho utilizzato RhinoMock in Unit Test. definisco il mio oggetto fittizio in tale maniera, con sessionToken è stringa digitata:.RhinoMock: come eseguire lo stub e restituire un metodo con oggetto complesso come parametro

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false)); 

E 'ok per la sezione di codice al momento della chiamata FindById() per riportare il valida nuova nuova DeviceTypeRepository() NewTable (false);

Tuttavia, quando includere un parametro complesso come oggetto, come un DataTable, nel Stub come di seguito:

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false)); 

Poi la sezione di codice in cui find() viene richiamato, lo fa NON ritorno previsto nuovo DeviceTypeRepository(). NewTable (false). Si noti che il valore di input del parametro dataTable è lo stesso sia nel richiamo Stub che in Find().

Quindi, la mia domanda è: Come si può implementare tale parametro (DataTable immesso e più in generale) nell'inizializzazione dello stub utilizzando RhinoMock? Sarei grato a qualsiasi consiglio e approccio. Grazie

+0

è '_value_ del dataTable' o _reference_ lo stesso in entrambi i Stub()' 'e' find() '? – Jeroen

risposta

6

Se non restituisce ciò che ci si aspetterebbe, i parametri tra la chiamata stub e la chiamata effettiva non corrispondono. Diciamo che hai qualcosa di simile:

// Set expectations 
var someDataTable = new DataTable(columns, raws); 
mockRepository 
    .Stub(repository => repository.Find(sessionToken, dataTable)) 
    .Return(new DeviceTypeRepository().NewTable(false)); 

// Actual test 
var anotherDataTable = new DataTable(columns, raws); 
yourTestObject.DoSomethingThatLooksForTheDataTable(repository); 

La cosa qui che, anche se il someDataTable e anotherDataTable hanno esattamente lo stesso contenuto, non sono lo stesso oggetto e quando RhinoMocks confrontano la chiamata stub al reale chiamare il i parametri non corrispondono Che cosa si può fare è utilizzare vincoli:

mockRepository 
    .Stub(repository => repository.Find(
     Arg<SessionID>.Matches(y => y.ID == 2), 
     Arg<DataTable>.Matches(x => x.Columns == columns && x.Raws == raws) 
    )) 
    .Return(true); 
+0

Esiste un altro modo per utilizzare Contraints of RhinoMock? Qualcosa di simile: mockRepository.Stub (repository => repository.Find (..., ...)). Contraint (Is.EqualTo (x), ...) –

8

Credo che il problema non sia in un tipo di dati complesso ma piuttosto nelle aspettative che hai impostato.

Come primo tentativo di risolvere il problema, aggiungere IgnoreArguments() prima dello Return. Potrebbe essere che DataTable hai specificato in attesa differisce dalla realtà-passato-in DataTable caso quindi le aspettative non passeranno:

...Stub(...).IgnoreArguments().Return(); 

Se non aiutato è possibile eseguire il debug utilizzando manualmente WhenCalled():

...Stub(...).IgnoreArguments().WhenCalled(
    mi => 
    { 
     var token = mi.Arguments[0] as TokenDataType; 
     var dataTable = mi.Arguments[1] as DataTable; 
    }).Return(); 

Se ciò non aiuta, provare ad aggiungere Repeat().Any() dopo il Return() e vedere se funziona. Suppongo che se il metodo fosse chiamato alcune volte, potresti aver perso il primo valore di ritorno, ma potrei sbagliarmi.

+0

Mi è piaciuto l'utilizzo di WhenCalled. Tuttavia, con Stub non è necessario aggiungere Repeat(). Any(), è il comportamento predefinito. –

+0

@Amittai Shapira: buon punto, grazie, qualsiasi riferimento alla documentazione? Per lo più uso Mock e per finto non si ripete di default – sll

+1

Grazie per aver chiesto prove. Ho sbagliato :-(il comportamento di mock e stub in questo caso è simile, l'impostazione predefinita è Repeat(). Once(): http://groups.google.com/group/rhinomocks/browse_thread/thread/03aff4992b5607cb –