È 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?
hai incontrato una delle conseguenze della violazione della legge di Demetra: http://clintshank.javadevelopersjournal.com/long_unit_test_setup. htm –
@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
Non è necessario aggiungere metodi pass-through sull'oggetto di configurazione. Perché non aggiungere semplicemente un argomento costruttore per il repository? 'nuovo DomainController (fakeConfiguration, fakeRepository);' –