Recentemente, tive a chance de trabalhar em uma enorme base de código que tem sido desenvolvida e mantida por um longo tempo. Quando chega a hora de refatorar, você vai querer ter uma suíte de testes confortável e confiável com a qual contar, mas todos nós sabemos que isso nem sempre é o caso, especialmente ao falar de código que já existe há algum tempo.
À procura de uma estratégia segura de refatoração, me deparei com o CgiHttpKernel, e ele realmente me fez ganhar o dia, permitindo que eu testasse meus scripts legados.
Depois de brincar um pouco com ele, quero compartilhar minha experiência com você.
O problema
Se você já tentou de refatorar um script PHP legado e velho, sabe muito bem a dor de cabeça. Você pode esquecer todas as suas ferramentas legais de teste, a certeza de uma aplicação MVC, a confiabilidade da separação entre a lógica e a apresentação. Você está agora lidando com echo, exit, header(), setcookie () todos misturados em uma única massa de código.
Você quer refatorar seu código para torná-lo melhor, mas também precisa mantê-lo funcionando e não quebrar as coisas. Você precisa de algum tipo de teste que pode lhe assegurar que não está mudando o comportamento do script, mas testar esse tipo base de código não é tão simples.
Aí vem o CgiHttpKernel.
A solução
A solução é muito simples e bastante brilhante: CGI. Nós a tivemos sob nosso próprio nariz por um longo tempo. CGI é uma maneira simples de falar com um aplicativo usando pipes de UNIX. Com essa interface comum, é muito fácil fingir ser um servidor web e executar praticamente todas as aplicações, mesmo um bagunçado e antiquado script PHP legado.
No mundo do PHP, colocamos todas as peças no lugar: php- cgi e HttpKernelInterface: estava apenas faltando a cola. Felizmente, a comunidade PHP é um lugar cheio de pessoas inteligentes e Igor Wiedler veio com a cola do CgiHttpKernel 😀
Com o CgiHttpKernel, você pode “embrulhar” qualquer aplicação PHP com a qual precise trabalhar (pode ser um único script php ou um aplicativo Zend Framework) e interagir com ele enviando Symfony\Component\HttpFoundation\Request e retornar Symfony\Component\HttpFoundation\Response.
Agora você pode usar qualquer biblioteca que integre o HttpKernelInterface, seu aplicativo legado acaba saltar para desenvolvimento PHP moderno.
Dê-me um exemplo
Na verdade, eu não vou, você pode encontrar tudo que precisa diretamente no arquivo readme do projeto; não há a necessidade de duplicar trechos aqui.
Eu só tive um pequeno problema com o caminho do arquivo, com o qual eu perdi algum tempo, que vale a pena compartilhar. Aparentemente, se você tem um caminho relativo contendo ../, o php- cgi pode não resolver o caminho do arquivo e você terá respostas 404 . Eu não tenho certeza se esse é um bug no kernel ou na implementação php-cgi, eu apenas resolvi isso convertendo o caminho para um path absoluto usando o realpath.
Basicamente:
$kernel = new CgiHttpKernel(__DIR__ . '/../../../your/src/root/dir');
não funcionará
$kernel = new CgiHttpKernel(realpath(__DIR__ . '/../../../your/src/root/dir'));
vai funcionar perfeitamente.
***
Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://www.ftassi.com/blog/2014/04/11/exploiting-cgi-functional-testing/#.U2etxnL6w2a