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?
(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 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.