Come ho capito, il punto dei test unitari è quello di testare unità di codice in isolamento . Ciò significa che:
- Non dovrebbero interrompere il codice non correlato cambiare altrove nel codebase.
- Solo un test di unità dovrebbe essere superato da un bug nell'unità testata, al contrario dei test di integrazione (che potrebbero rompersi in heap).
Tutto ciò implica che ogni dipendenza esterna di un'unità testata dovrebbe essere derisa. E intendo tutte le dipendenze esterne , non solo i "livelli esterni" come rete, file system, database, ecc.
Ciò porta a una conclusione logica, che praticamente ogni test di unità ha bisogno di prendere in giro . D'altra parte, una rapida ricerca su Google che deride rivela tonnellate di articoli che affermano che "il beffardo è un odore di codice" e che dovrebbe essere evitato (anche se non completamente).
Ora, alle domande.
- Come dovrebbero essere scritti correttamente i test unitari?
- Dove si trova esattamente la linea tra loro e i test di integrazione?
Aggiornamento 1
Prendi in considerazione il seguente pseudo codice:
class Person {
constructor(calculator) {}
calculate(a, b) {
const sum = this.calculator.add(a, b);
// do some other stuff with the 'sum'
}
}
Può un test che verifica il metodo Person.calculate
senza prendere in giro la dipendenza Calculator
(dato che la Calculator
è una classe leggera che non accede al "mondo esterno") può essere considerata un test unitario?