Como posso escrever testes para upload de arquivos no PHP?

Estou usando o SimpleTest para escrever meus testes PHP. Estou escrevendo um plugin de upload de arquivos e me pergunto como posso testá-lo.

Gostaria de verificar se o arquivo foi carregado corretamente, na pasta certa, esse erro é devolvido corretamente quando necessário, etc.

Como eu imito uma transferência de arquivos (através da variável $ _FILES)? Há problemas que eu deveria estar ciente?

Encontrei uma solução alternativa. Eu falsifiquei a matriz $_FILES com dados de teste, criei arquivos de teste falsos na pasta tmp/ (a pasta é irrelevante, mas tentei ficar com o padrão).

O problema era que is_uploaded_file e move_uploaded_file não podiam funcionar com esses itens falsificados, porque eles não são realmente carregados através do POST . A primeira coisa que fiz foi encapsular essas funções dentro do meu próprio moveUploadedFile e isUploadedFile no meu plugin para que eu possa zombá-los e alterar seu valor de retorno.

A última coisa foi estender a class ao testá-la e sobrescrever moveUploadedFile para usar rename vez de move_uploaded_file e isUploadedFile para usar file_exists vez de is_uploaded_file .

De acordo com o Docs, o SimpleTest tem suporte para testes do FileUpload cozidos desde a versão 1.0.1:

 File upload testing Can simulate the input type file tag 1.0.1 

Eu examinei os exemplos em seu site e assumiria que você usaria algo ao longo das linhas de

 $this->get('http://www.example.com/'); $this->setField('filename', 'local path'); $this->click('Go'); 

para enviar o arquivo e, em seguida, usar as afirmações regulares para verificar o upload funcionou como desejado. Mas isso é realmente apenas um palpite selvagem, já que não conheço o SimpleTest e não consegui encontrar um exemplo em sua página inicial. Você pode querer perguntar no seu fórum de suporte.

Mas basicamente, não há muitos testes de uso que um formulário envia um arquivo. Este é o comportamento do navegador testado e testado. Testar o código que manipula o upload faz mais sentido. Não sei como você implementou seu código FileUpload, mas se eu tivesse que implementar isso, eu me livraria da dependência da matriz $_FILES como a primeira coisa. Crie uma class FileRequest qual você possa passar a matriz $_FILES . Então você pode lidar com o upload da class. Isso permitiria que você testasse a funcionalidade sem realmente carregar um arquivo. Basta configurar sua instância FileRequest em conformidade. Você poderia até mesmo zombar do sistema de arquivos com vfsStreamWrapper , então você nem precisa de arquivos reais.

Você pode gerar um carregamento de arquivos de forma programática com, por exemplo, a extensão curl .

Uma vez que isso requer PHP executado sob um servidor web, não é um teste de unidade. Consequentemente, a melhor maneira seria usar testes PHPT e preencher a seção --POST_RAW-- com os dados.

Se você não sabe o que colocar no --POST_RAW-- , tente instalar a extensão TamperData Firefox, faça uma apresentação de arquivos do Firefox e copie-colar os dados do lado direito.

Para testes de unidade (em oposição ao teste funcional), tente carregar um arquivo (um arquivo de texto curto) para uma página de teste e var_dump($_FILES) e var_dump($_POST) . Então, você sabe o que é preenchê-los (ou suas mofetas).