Manteniéndose OO y verificable mientras trabaja con una base de datos

15

¿Cuáles son algunas estrategias de POO para trabajar con una base de datos pero manteniendo la unidad comprobable? Digamos que tengo una clase de usuario y mi entorno de producción funciona contra MySQL. Veo un par de posibles enfoques, que se muestran aquí usando PHP:

  1. Pase un $ data_source con interfaces para load() y save() , para abstraer la fuente de datos de back-end. Al realizar la prueba, pase un almacén de datos diferente.

    $user = new User( $mysql_data_source );
    $user->load( 'bob' );
    $user->setNickname( 'Robby' );
    $user->save();
    
  2. Use una fábrica que acceda a la base de datos y pase la fila de resultados al constructor del Usuario. Al realizar la prueba, genere manualmente el parámetro $ row o simule el objeto en UserFactory :: $ data_source. (¿Cómo puedo guardar los cambios en el registro?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

Tengo Patrones de diseño y Código limpio a mi lado, pero estoy luchando por encontrar conceptos aplicables.

    
pregunta Annika Backstrom 02.02.2011 - 15:53
fuente

4 respuestas

10

Entonces, lo que desea recoger es Patrones de arquitectura de aplicaciones empresariales de Martin Fowlers (también proporciona una catálogo en su sitio web aquí ).

En él describe varios patrones para abstraer el acceso a datos. El primer enfoque que describe es Active Record . Su segundo enfoque es similar a Puerta de enlace de datos de tabla .

Un enfoque aún mejor es usar un O / RM para eliminar la necesidad de escribir el código de acceso a datos a mano. No he usado PHP desde que estábamos preocupados por el Y2K, pero wikipedia tiene una lista de opciones para ti . Aunque no sé si son buenos. Sin embargo, puedo decirle algunas cosas que debe buscar en una O / RM:

  • Ignorancia de la persistencia : la O / RM no debería obligar a los objetos de su negocio a derivar de una interfaz / clase específica para participar en la estrategia de acceso a los datos.
  • Asignación de relaciones : debe poder mapear las relaciones entre sus objetos (un cliente tiene pedidos, los pedidos tienen artículos de línea, los artículos de línea tienen un producto, etc.)
  • Asignación jerárquica : debe poder asignar jerarquías de clase a la base de datos.
  • Sintaxis de consulta / compatibilidad con criterios : debe poder crear una consulta en tiempo de ejecución en términos de sus Objetos no en términos de la base de datos, y la O / RM debe traducir y ejecutar la consulta en el base de datos. Puntos extra si la consulta es una cadena fuertemente tipada en lugar de una cadena.

Hay otros factores a considerar, pero esos son algunos de los más importantes. Espero que esto ayude.

    
respondido por el Michael Brown 02.02.2011 - 20:18
fuente
6

En mi humilde opinión, depende de lo que quiera probar. Si desea probar su lógica de negocios en unidad, debe marcar / simular ( Martin Fowler ) su acceso a los datos, por lo que su primera sugerencia es un buen comienzo. Esta pregunta de stackoverflow da un buen ejemplo de C # (I Intenté encontrar algunas muestras de PHP pero no pude encontrar ninguna.

Si desea probar el acceso a los datos en sí mismo, ya no se llama prueba de unidades sino pruebas de integración. Para obtener una orientación general, esta pregunta de stackoverflow también tiene algunos enlaces interesantes.

Si desea probar la lógica del procedimiento almacenado en su base de datos, consulte xUnit TestPattern

Espero que esto ayude

    
respondido por el KeesDijk 02.02.2011 - 17:23
fuente
1

Esta no es necesariamente una respuesta inmediata, pero si está realmente preocupado por la capacidad de prueba de la base de datos, debe investigar cómo se hace en Ruby on Rails. Que yo sepa, nadie ha cubierto el tema mejor o más intuitivamente.

    
respondido por el Adam Crossland 02.02.2011 - 16:20
fuente
0

Recomiendo que compruebes la solución de Symfony Framework para este tipo de problema. Symfony es un framework php OO con pruebas funcionales.

Aquí hay un enlace , utilizaron algo como lo que estás pensando.

    
respondido por el guiman 02.02.2011 - 16:26
fuente

Lea otras preguntas en las etiquetas