2010-02-02 13 views
6

Czy można sfałszować wywołanie członu obiektu pośredniczącego/makiety bez konieczności definiowania tego jako kodu pośredniczącego, a także ustawić wartość zwracaną jako wszystkie oddzielne szczegółowe wiersze?Czy Rhino Mock może zagłębić się/zagnieździć członków bezpośrednio?

Przykład:

[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); 
    } 

Czy wszystkie te zmienne tymczasowe konieczne tylko skrótową z zagnieżdżonych wywołań metod?

+0

pan napotkasz jeden z konsekwencjami naruszania prawa Demeter: http://clintshank.javadevelopersjournal.com/long_unit_test_setup. htm –

+0

@wcoenen well .. obiekt konfiguracyjny nie powinien tak naprawdę obsługiwać bezpośrednio tego, co w nim jest czy bym myślał? Przynajmniej ten jeden poziom zagnieżdżania wydaje się ważny lub cenny. ponieważ jest to głównie tylko bezczynne narzędzie DTO – Maslow

+0

Nie musisz koniecznie dodawać metod tranzytowych do obiektu konfiguracji. Dlaczego nie dodać argumentu konstruktora dla repozytorium? 'nowy DomainController (fakeConfiguration, fakeRepository);' –

Odpowiedz

3

Nigdy nie korzystałem z tej funkcji, więc nie jestem w 100% pewien, że to zadziała, ale teoretycznie Rhino kpi z "recursive mocking", co powinno pozwolić ci przynajmniej na wycięcie fałszywegoAssociateRepository przez zrobienie czegoś takiego :

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); 

(uwaga: kod nie testowane, lub nawet skompilowany)

Powiązane problemy