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:
-
Passa a $ data_source con interfacce per
load()
esave()
, 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();
-
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.