Quando si creano test di unità per questi altri oggetti, qual è il modo migliore per creare oggetti mock che forniscono dati ad altri oggetti. Dovrebbero essere creati ad un 'alto livello' e intercettare le chiamate il prima possibile, o dovrebbero essere fatte a un 'basso livello' e quindi fare quanto il codice reale è ancora chiamato?
es. Sto scrivendo un test per un codice che richiede un oggetto NoteMapper
che permetta a Notes di essere caricato dal DB.
class NoteMapper {
function getNote($sqlQueryFactory, $noteID) {
// Create an SQL query from $sqlQueryFactory
// Run that SQL
// if null
// return null
// else
// return new Note($dataFromSQLQuery)
}
}
Potrei prendere in giro questo oggetto a un livello elevato creando un oggetto NoteMapper fittizio, in modo che non ci siano affatto chiamate all'SQL, ad es.
class MockNoteMapper {
function getNote($sqlQueryFactory, $noteID) {
//$mockData = {'Test Note title', "Test note text" }
// return new Note($mockData);
}
}
Oppure potrei farlo a un livello molto basso, creando un MockSQLQueryFactory che invece di interrogare effettivamente il database fornisce solo dati di simulazione e lo passa all'attuale oggetto NoteMapper.
Sembra che creare mock ad alto livello sia più facile a breve termine, ma che a lungo termine farlo a un livello basso sarebbe più potente e, eventualmente, consentire una maggiore automazione dei test, ad es. registrando i dati in un DB esterno e quindi riproducendo i dati per i test.
C'è un modo consigliato di creare mock? Esistono norme rigide e veloci su quali sono le migliori o dovrebbero essere entrambe utilizzate laddove appropriato?