# Testes unitários em classes Active Record

**URL:** <https://forum.casadocodigo.com.br/t/testes-unitarios-em-classes-active-record/1732>\
**Category:** Livros\
**Tags:** tdd-php\
**Created:** [Agosto 12, 2020, 12:10am UTC](https://forum.casadocodigo.com.br/t/testes-unitarios-em-classes-active-record/1732 "2020-08-12T00:10:42Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![arthur](https://avatars.discourse-cdn.com/v4/letter/a/958977/32.png) [@arthur](https://forum.casadocodigo.com.br/u/arthur)\
**Post date:** [Agosto 12, 2020, 12:10am UTC](https://forum.casadocodigo.com.br/t/testes-unitarios-em-classes-active-record/1732/1 "2020-08-12T00:10:42Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![peagha](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.casadocodigo.com.br/peagha/32/14548_2.png) [@peagha](https://forum.casadocodigo.com.br/u/peagha)\
**Post date:** [Agosto 14, 2020, 4:24am UTC](https://forum.casadocodigo.com.br/t/testes-unitarios-em-classes-active-record/1732/2 "2020-08-14T04:24:28Z")

</div>

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? 📔

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 💔

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](https://martinfowler.com/eaaCatalog/dataMapper.html) ou um [Repository](https://docs.microsoft.com/pt-br/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design). 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.
