Restare OO e verificabili mentre si lavora con un database

15

Quali sono alcune strategie OOP per lavorare con un database ma mantenere le unità testabili? Diciamo che ho una classe User e il mio ambiente di produzione funziona contro MySQL. Vedo un paio di possibili approcci, mostrati qui usando PHP:

  1. Passa a $ data_source con interfacce per load() e save() , per astrarre l'origine backend dei dati. Durante il test, passa un altro archivio dati.

    $user = new User( $mysql_data_source );
    $user->load( 'bob' );
    $user->setNickname( 'Robby' );
    $user->save();
    
  2. Utilizzare un factory che accede al database e passa la riga del risultato al costruttore dell'utente. Durante il test, generare manualmente il parametro $ row o simulare l'oggetto in UserFactory :: $ data_source. (Come posso salvare le modifiche al record?)

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

Ho Design Patterns e Clean Code qui accanto a me, ma sto cercando di trovare concetti applicabili.

    
posta Annika Backstrom 02.02.2011 - 15:53
fonte

4 risposte

10

Quindi quello che vuoi raccogliere è Patterns of Enterprise Application Architecture di Martin Fowlers (fornisce anche un catalogo sul suo sito web qui ).

In esso descrive diversi modelli per l'astrazione dell'accesso ai dati. Il primo approccio che descrivi è Record attivo . Il secondo approccio è simile a Gateway dati tabella .

Un approccio ancora migliore è utilizzare un O / RM per rimuovere la necessità di scrivere a mano il codice di accesso ai dati. Non ho usato PHP poiché eravamo preoccupati per Y2K, ma wikipedia ha un elenco di opzioni per te . Non so se sono comunque buoni. Posso comunque dirti alcune cose da cercare in un O / RM:

  • Ignoranza persistenza : l'O / RM non deve forzare i tuoi oggetti di business a derivare da una specifica interfaccia / classe per partecipare alla strategia di accesso ai dati.
  • Mappatura delle relazioni : dovresti essere in grado di mappare le relazioni tra gli oggetti (un cliente ha ordini, gli ordini hanno elementi pubblicitari, gli elementi pubblicitari hanno un prodotto, ecc.)
  • Mappatura gerarchica : dovresti riuscire a mappare le gerarchie di classi nel database.
  • Supporto della sintassi / dei criteri di query : dovresti essere in grado di creare una query in fase di esecuzione in termini di oggetti non in termini di database e O / RM deve tradurre ed eseguire la query sul Banca dati. Punti extra se la query è una catena strongmente tipizzata anziché una stringa.

Ci sono altri fattori da considerare, ma quelli sono alcuni dei più importanti. Spero che questo aiuti.

    
risposta data 02.02.2011 - 20:18
fonte
6

IMHO dipende da ciò che si desidera testare, se si desidera testare la logica aziendale dell'unità, si dovrebbe eseguire lo stub / mock ( Martin Fowler ) accedi ai tuoi dati in modo che il tuo primo suggerimento sia un buon inizio. Questa domanda di stackoverflow fornisce un bel esempio di C # (I ho cercato di trovare alcuni esempi di PHP ma non ne ho trovato nessuno.

Se si desidera testare l'accesso ai dati di per sé, non viene più chiamato test delle unità ma test di integrazione. Leggi qui per una guida generale, questa domanda di stackoverflow ha anche alcuni link interessanti.

Se vuoi testare la logica delle stored procedure nel tuo database guarda xUnit TestPattern

Spero che questo aiuti

    
risposta data 02.02.2011 - 17:23
fonte
1

Questa non è necessariamente una risposta immediatamente utile, ma se sei davvero preoccupato della testabilità del database, dovresti esaminare come viene fatto in Ruby on Rails. Per quanto ne so, nessuno ha trattato l'argomento in modo migliore o più intuitivo.

    
risposta data 02.02.2011 - 16:20
fonte
0

Ti raccomando di controllare la soluzione Symfony Framework per questo tipo di problema. Symfony è un framework php OO con test funzionali.

Ecco un link , hanno usato qualcosa di simile a ciò a cui stai pensando.

    
risposta data 02.02.2011 - 16:26
fonte

Leggi altre domande sui tag