Testes unitários em classes Active Record

Alguns frameworks PHP utilizam um Active Record como model, o que faz com que a regra de negócios fique fortemente acoplada ao BD. Além disso, o SRP não é respeitado neste padrão.

Tendo em vista este forte acoplamento, como é possível fazer testes unitários nestes casos?

1 Curtida

Olá Arthur! Ótima pergunta.

(PS: não sou autor do livro de testes com PHP, sou autor do livro “TDD e BDD na prática”)

Você teria um exemplo de código que poderíamos usar como referência? :notebook_with_decorative_cover:

De maneira geral, se você tem uma classe que usa bastante ActiveRecord pode ser mais interessante ter um banco de dados rodando nos testes do que tentar isolar completamente o banco de dados, pois criar um mock fiel do banco de dados é bastante difícil. Você pode por exemplo ignorar constraints que o banco tem e criar um teste que não condiz com a realidade :broken_heart:

Rodar o banco de dados nos teste é uma prática comum e a maioria dos frameworks tem configurações para criar um banco de testes. Inclusive, pelo menos no Ruby onde tenho mais experiência, mesmo rodando o banco de dados, testes de uma classe que usa Active Record ficam na pasta de testes unitários.

Conceitualmente falando, não seria um teste unitário pois o banco de dados não é um componente isolado. Mas aí é mais uma questão de nomenclatura. Se você quiser ser muito fiel aos conceitos você pode escolher colocar esses testes na pasta de integração.

Se você quiser isolar o Active Record completamente, você pode introduzir uma camada para abstrair as operações do banco, como um Data Mapper ou um Repository. Porém, esse é um caminho que traz consigo complexidade e indireção. Não é algo que eu recomendaria a não ser que seu sistema tenha uma complexidade grande, quando o benefício desse tipo de abstração compensa a complexidade adicionada.

1 Curtida