2010-02-02 11 views
6

È possibile prendere in giro una chiamata membro dell'oggetto stub/mock senza doverlo definire come stub e impostare anche il valore restituito come tutte le righe dettagliate separate?Può Rhino Mock direttamente i membri più profondi/nidificati?

Esempio:

[TestMethod] 
    public void AssignedPermissions_AssociateExists_ReturnsEdit_Rhino() 
    { 

     //Arrange 
     var fakeConfiguration = MockRepository.GenerateStub<IDomainControllerConfiguration>(); 
     var fakeAssociateRepository = MockRepository.GenerateStub<IAssociateRepository>(); 
     fakeConfiguration.Stub(x => x.AssociateRepository).Return(fakeAssociateRepository); 
     fakeAssociateRepository.Stub(x=>x.GetAssociatesByRole(null,false,null)).IgnoreArguments() 
      .Return(new IAssociate[]{MockRepository.GenerateStub<IAssociate>()}); 

     var domain = new DomainController(fakeConfiguration); 

     const AssignedPermission expected = AssignedPermission.Edit; 

     //Act 
     AssignedPermission actual = domain.AssignedPermissions(); 

     //Assert 
     Assert.AreEqual(expected, actual); 
    } 

Sono tutte quelle variabili temporanee necessarie solo per spegnere le chiamate di metodo annidati?

+0

hai incontrato una delle conseguenze della violazione della legge di Demetra: http://clintshank.javadevelopersjournal.com/long_unit_test_setup. htm –

+0

@wcoenen beh .. l'oggetto di configurazione non dovrebbe realmente gestire direttamente ciò che è in sé il chiamante penserei? Quindi almeno questo livello di nidificazione sembra importante o prezioso. in quanto si tratta principalmente di un semplice DTO – Maslow

+0

Non è necessario aggiungere metodi pass-through sull'oggetto di configurazione. Perché non aggiungere semplicemente un argomento costruttore per il repository? 'nuovo DomainController (fakeConfiguration, fakeRepository);' –

risposta

3

Non ho mai usato la funzionalità, quindi non sono sicuro al 100% che funzioni, ma teoricamente Rhino Mocks supporta "recursive mocking", che dovrebbe consentire di ritagliare almeno il FakeAssociateRepository facendo qualcosa come questo :

var fakeConfiguration = MockRepository.GenerateStub<IDomainControllerConfiguration>(); 
fakeConfiguration.Stub(x => x.AssociateRepository.GetAssociatesByRole(null,false,null)) 
      .IgnoreArguments() 
      .Return(new IAssociate[]{MockRepository.GenerateStub<IAssociate>()}); 

var domain = new DomainController(fakeConfiguration); 

(nota: il codice non testato, o addirittura compilato)

Problemi correlati