¿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?
le han acabado en una de las consecuencias de violar la ley de Demeter: http://clintshank.javadevelopersjournal.com/long_unit_test_setup. htm –
@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
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);' –