1
resposta

[Dúvida] Dúvida com campo ImageField

Eu resolvi fazer um teste com um modelo que contivesse um campo de imagem:

class Depoimento(models.Model):
    '''
    Classe de modelo de Depoimentos
    '''
    nome = models.CharField(max_length= 50, blank=False, null=False)
    depoimento = models.TextField(max_length=200, null = False)
    foto = models.ImageField(upload_to='fotos-depoimentos' , blank=True)

Para fazer os testes de requisição, eu criei a seguinte classe:

class DepoimentosTestCase(APITestCase):
    def setUp(self):
        self.usuario =  User.objects.create_superuser(username='admin',password='admin')
        self.url = reverse('Depoimentos-list')
        self.client.force_authenticate(user = self.usuario)
        
        self.foto = SimpleUploadedFile(
            name='foto_de_teste.jpg',
            content=open('Foto depoimento/download.jpg','rb').read(),
            content_type = 'image/jpg'
        )

        self.depoimento_1 = Depoimento.objects.create(
            nome = 'Teste um',
            depoimento = 'Depoimento teste',
            foto = self.foto
        )
        self.depoimento_2 = Depoimento.objects.create(
            nome ='Teste dois',
            depoimento='Depoimento teste 2',
            foto = self.foto
        )

Pelo fato de ser um campo de arquivo, os testes estão falhando para POST e PUT:

    def test_requisicao_post_depoimentos(self):
        dados = {
            'nome': 'Testando',
            'depoimento': 'Testando depoimento',
            'foto' : self.foto
        }
        response = self.client.post(self.url,data = dados)
        self.assertEqual(response.status_code,status.HTTP_201_CREATED)

        def test_requisicao_put_depoimentos(self):
        dados = {
            'nome': 'Testando denovo',
            'depoimento': 'Testando depoimento 2',
            'foto': self.foto

        }
        response = self.client.put(self.url+'1/', dados)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

Não estou entendendo muito bem como posso corrigir isso

1 resposta

Olá Jonathas! Tudo bem?

Trabalhar com campos de imagem em testes pode ser um pouco desafiador devido à forma como os dados são enviados. No seu caso, parece que o problema pode estar relacionado ao formato em que os dados estão sendo enviados nas requisições POST e PUT. Quando lidamos com arquivos, como imagens, precisamos garantir que os dados sejam enviados como multipart/form-data.

No Django REST Framework, para enviar arquivos em um teste, você pode usar o APIClient e especificar o tipo de conteúdo como multipart. Aqui está como você pode ajustar seus testes:

from rest_framework.test import APIClient

class DepoimentosTestCase(APITestCase):
    def setUp(self):
        self.usuario = User.objects.create_superuser(username='admin', password='admin')
        self.url = reverse('Depoimentos-list')
        self.client = APIClient()
        self.client.force_authenticate(user=self.usuario)

        self.foto = SimpleUploadedFile(
            name='foto_de_teste.jpg',
            content=open('Foto depoimento/download.jpg', 'rb').read(),
            content_type='image/jpeg'
        )

        self.depoimento_1 = Depoimento.objects.create(
            nome='Teste um',
            depoimento='Depoimento teste',
            foto=self.foto
        )
        self.depoimento_2 = Depoimento.objects.create(
            nome='Teste dois',
            depoimento='Depoimento teste 2',
            foto=self.foto
        )

    def test_requisicao_post_depoimentos(self):
        dados = {
            'nome': 'Testando',
            'depoimento': 'Testando depoimento',
            'foto': self.foto
        }
        response = self.client.post(self.url, data=dados, format='multipart')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

    def test_requisicao_put_depoimentos(self):
        dados = {
            'nome': 'Testando denovo',
            'depoimento': 'Testando depoimento 2',
            'foto': self.foto
        }
        response = self.client.put(f'{self.url}1/', data=dados, format='multipart')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

Note que adicionei format='multipart' nas chamadas post e put. Isso deve ajudar a resolver o problema com o envio de arquivos nos seus testes.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.