1
resposta

Erro com testes da requisição POST

Tenho o seguinte código que julgo ser o mesmo da aula

    def test_requisicao_post_para_criar_curso(self):
        """Teste para verificar a requisição POST para criar um curso"""
        data = {
            'codigo_curso':'CTT3',
            'descricao':'Curso teste 3',
            'nivel':'C'
        }
        response = self.client.post(self.list_url, data=data)
        self.assertEquals(response.status_code, status.HTTP_201_CREATED)

Porem ao executar o teste com o comando python manage.py test recebo o erro:

    assert isinstance(response, HttpResponseBase), (
AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`

----------------------------------------------------------------------
Ran 2 tests in 0.048s

FAILED (failures=1)
Destroying test database for alias 'default'...

A qual indica que self.client.post(self.list_url, data=data) esta retornando algo diferente do esperado.

1 resposta

Olá, Artur! Tudo bem?

O erro que você está recebendo indica que a resposta do seu teste não é do tipo esperado (HttpResponseBase), mas sim NoneType.

A causa mais comum para esse erro é que a função de view correspondente à URL que você está tentando acessar com o método POST não está retornando uma resposta. Ou seja, o Django espera que toda função de view retorne uma instância de HttpResponse (ou uma classe filha desta), mas a sua função de view pode estar terminando sem retornar nada (None).

Vamos considerar que você tenha uma função de view semelhante a esta:

def minha_view(request):
    if request.method == 'POST':
        # processa os dados do POST
        # ...
        # esquece de retornar uma resposta

Neste caso, quando você tenta acessar essa view com um método POST, a função termina sem retornar nada. Isso faz com que o Django lance o erro que você está vendo.

Para corrigir isso, você precisa garantir que sua função de view sempre retorne uma instância de HttpResponse. Por exemplo:

from django.http import JsonResponse

def minha_view(request):
    if request.method == 'POST':
        # processa os dados do POST
        # ...
        return JsonResponse({'message': 'Criado com sucesso'}, status=201)

Neste exemplo, a função de view retorna um JsonResponse com uma mensagem e um status HTTP de 201 (Created), que é o que você está esperando no seu teste.

Verifique suas views e certifique-se de que elas estão retornando uma resposta. Se o problema persistir, por favor, compartilhe o código da sua view para que eu possa entender melhor o que pode estar acontecendo.

Espero ter ajudado e bons estudos!

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