Alcune persone sostengono che i test di integrazione sono tutti i tipi di cattivi e sbagliati - tutto deve essere testato in unità, il che significa che devi deridere le dipendenze; un'opzione che, per vari motivi, non mi piace sempre.
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 dimostrare in un test che questo repository può effettivamente trovare prodotti che corrispondono a varie parole chiave fornite.
A corto di test di integrazione con un oggetto di connessione reale, come posso sapere che questo sta effettivamente generando query reali e che quelle query fanno effettivamente quello che penso facciano?
Se devo deridere l'oggetto di connessione in un'unità-test, posso solo provare cose come "che genera la query previsto" - ma questo non significa che in realtà è di andare a lavorare ... cioè, forse è la generazione di query Mi aspettavo, ma forse quella query non fa quello che penso faccia.
In altre parole, mi sento come un test che fa affermazioni circa la query generato, è essenzialmente privo di valore, perché è come il test findByKeyword()
è stato il metodo attuato , ma che non prova che in realtà funziona .
Questo problema non si limita ai repository o all'integrazione del database: sembra applicarsi in molti casi, in cui fare affermazioni sull'uso di una simulazione (test-double) dimostra solo come vengono implementate le cose, non se lo faranno funziona davvero.
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é il test di integrazione porta a una miriade di percorsi di codice, tutti i quali non possono essere testati, ma nel caso di un servizio (come un repository) il cui unico scopo è per interagire con un altro componente, come puoi davvero testare qualsiasi cosa senza test di integrazione?