2010-02-02 7 views
6

¿Es posible simular una llamada de miembro de objeto de stub/mock sin tener que definirlo como un stub, y también establecer el valor de retorno como todas las líneas detalladas separadas?¿Puede Rhino burlarse de los miembros más profundos/anidados directamente?

Ejemplo:

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

Son todas aquellas variables temporales necesarios sólo para apagar las llamadas a métodos anidados?

+0

le han acabado en una de las consecuencias de violar la ley de Demeter: http://clintshank.javadevelopersjournal.com/long_unit_test_setup. htm –

+0

@wcoenen bien ... el objeto de configuración no debería realmente ser el manejo directo de lo que dentro de sí mismo la persona que llama ¿pensaría yo? Entonces, al menos este nivel de anidación parece importante o valioso. ya que esto es más que nada un simple DTO – Maslow

+0

No es necesario que tenga que agregar métodos de paso en el objeto de configuración. ¿Por qué no simplemente agregar un argumento constructor para el repositorio? 'nuevo DomainController (fakeConfiguration, fakeRepository);' –

Respuesta

3

Nunca he usado la funcionalidad, por lo que no estoy 100% seguro de que esto funcionará, pero en teoría Rhino mocks admite "recursive mocking", lo que debería permitir al menos eliminar el repositorio FakeAssociateReport haciendo algo como esto :

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: código no probado, o incluso compilado)

Cuestiones relacionadas