Alcune persone sostengono che i test di integrazione sono tutti i tipi di cattivo e sbagliato - tutto deve essere testato unitamente, il che significa che devi prendere in giro le dipendenze; un'opzione che, per vari motivi, non mi è sempre piaciuta.
Trovo che, in alcuni casi, un test unitario semplicemente non provi nulla.
Prendiamo come esempio la seguente (banale, ingenua) implementazione del repository (in PHP):
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
Diciamo che voglio provare in un test che questo repository può effettivamente trovare prodotti che corrispondono a varie parole chiave date.
A corto di test di integrazione con un oggetto di connessione reale, come faccio a sapere che questo sta effettivamente generando query reali e che quelle query fanno effettivamente quello che penso che facciano?
Se devo prendere in giro l'oggetto di connessione in un test di unità, posso solo provare cose come "genera la query prevista", ma ciò non significa che in realtà lavori . .. cioè, forse sta generando la query che mi aspettavo, ma forse quella query non fa quello che penso che faccia.
In altre parole, mi sento come un test che fa affermazioni sulla query generata, è essenzialmente senza valore, perché sta testando come il metodo findByKeyword()
sia implementato , ma ciò non prova che in realtà funziona .
Questo problema non si limita ai repository o all'integrazione del database - sembra applicarsi in molti casi, dove fare asserzioni sull'uso di un mock (test-double) dimostra solo come sono implementate le cose, non se sono " sta andando davvero a lavorare.
Come gestisci situazioni come queste?
I test di integrazione sono davvero "cattivi" in un caso come questo?
Capisco che è meglio testare una cosa, e capisco anche perché i test di integrazione conducano a una miriade di percorsi di codice, che non possono essere testati, ma nel caso di un servizio (come un repository) di cui l'unico scopo è interagire con un altro componente, come si può realmente testare qualcosa senza test di integrazione?