Em meu aplicativo django, eu tenho uma visão que realiza o upload de arquivos. O snippet principal é assim
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Eu gostaria de fazer o teste de unidade da visualização. Estou planejando testar o caminho feliz, bem como o caminho da falha ... ou seja, o caso em que o request.FILES
não tem 'arquivo' de chave, caso em que request.FILES['file']
tem None
..
Como faço para configurar os dados de postagem para o caminho feliz? Alguém pode me dizer?
django
unit-testing
file-upload
Damon
fonte
fonte
Respostas:
Da documentação do Django em
Client.post
:fonte
integration test
- realmente não importa até que você entre em bases de código mais complexas, talvez até mesmo com uma equipe de teste realEu costumava fazer o mesmo,
with open('some_file.txt') as fp:
mas depois precisava de imagens, vídeos e outros arquivos reais no repo e também estava testando uma parte de um componente principal do Django que foi bem testado, então, atualmente, é o que tenho feito:Em Python 3.5+ você precisa usar o
bytes
objeto em vez destr
. Mudar"file_content"
parab"file_content"
Está funcionando bem,
SimpleUploadedFile
cria umInMemoryFile
que se comporta como um upload normal e você pode escolher o nome, o conteúdo e o tipo de conteúdo.fonte
"file_content"
precisa ser um cabeçalho de imagem válido para que seu código pense que é uma imagem válida.Eu recomendo que você dê uma olhada no Django RequestFactory . É a melhor maneira de simular os dados fornecidos na solicitação.
Dito isso, encontrei várias falhas no seu código.
Então, eu recomendo que você refatore sua visão para usar uma função como:
E zombe disso. Você pode usar Python Mock .
PS: Você também poderia usar o Django Test Client. Mas isso significaria que você está adicionando outra coisa a mais para testar, porque esse cliente faz uso de Sessões, middlewares, etc. Nada semelhante ao Teste de Unidade.
fonte
profile_picture
que usa umaupload_profile_picture
função internamente . Se você quiser testar essa visão, apenas simule a função interna e certifique-se de que ela seja chamada em seu teste. Este é um exemplo simples: gist.github.com/santiagobasulto/6437356Eu faço algo assim para meu próprio aplicativo relacionado a eventos, mas você deve ter código mais do que suficiente para continuar com seu próprio caso de uso
fonte
Eu fiz algo assim:
A função create_image criará a imagem, então você não precisa fornecer o caminho estático da imagem.
Nota: Você pode atualizar o código de acordo com o seu código. Este código para Python 3.6.
fonte
No Django 1.7 há um problema com o TestCase que pode ser resolvido usando open (filepath, 'rb'), mas ao usar o cliente de teste não temos controle sobre ele. Acho que provavelmente é melhor garantir que file.read () retorne sempre bytes.
fonte: https://code.djangoproject.com/ticket/23912 , por KevinEtienne
Sem a opção rb, um TypeError é gerado:
fonte
fonte
Conforme mencionado na documentação oficial do Django :
Maiores Informações: Como verificar se o arquivo é passado como argumento para alguma função?
Durante o teste, às vezes queremos ter certeza de que o arquivo é passado como um argumento para alguma função.
por exemplo
Nos testes, use o mock do Python algo assim:
fonte
Espero que isto ajude.
fonte
Estou usando Python == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
Eu tentei,
self.client.post
mas encontrei umaResolver404
exceção.O seguinte funcionou para mim:
fonte