Algumas pessoas afirmam que os testes de integração são ruins e errados - tudo deve ser testado em unidade, o que significa que você precisa zombar de dependências; uma opção que, por várias razões, nem sempre gosto.
Acho que, em alguns casos, um teste de unidade simplesmente não prova nada.
Vamos tomar a seguinte implementação (trivial, ingênua) do repositório (em PHP) como exemplo:
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]);
}
}
Digamos que eu queira provar em um teste que esse repositório pode realmente encontrar produtos que correspondem a várias palavras-chave.
Sem testes de integração com um objeto de conexão real, como posso saber que isso realmente está gerando consultas reais - e que essas consultas realmente fazem o que eu acho que elas fazem?
Se eu tiver que zombar do objeto de conexão em um teste de unidade, só posso provar coisas como "ele gera a consulta esperada" - mas isso não significa que ele realmente funcionará ... ou seja, talvez esteja gerando a consulta Eu esperava, mas talvez essa consulta não faça o que eu acho que faz.
Em outras palavras, sinto que um teste que faz afirmações sobre a consulta gerada é essencialmente sem valor, porque está testando como o findByKeyword()
método foi implementado , mas isso não prova que ele realmente funciona .
Esse problema não se limita aos repositórios ou à integração do banco de dados - parece aplicar-se em muitos casos, onde fazer afirmações sobre o uso de um mock (teste duplo) prova apenas como as coisas são implementadas, não se elas vão realmente funciona.
Como você lida com situações como essas?
Os testes de integração são realmente "ruins" em um caso como este?
Entendo que é melhor testar uma coisa e também entendo por que o teste de integração leva a uma infinidade de caminhos de código, os quais não podem ser testados - mas no caso de um serviço (como um repositório) cujo único objetivo é para interagir com outro componente, como você pode realmente testar alguma coisa sem o teste de integração?