When using django.test.client.post I get Bad Request

Viewed 703

I use pytest-django to do unit test on my django project. The view is

def news(request):
    """
    Interface for newslist
    """
    page = 1
    if request.method == 'POST':
        content = request.body
        try:
            content = json.loads(content)
        except ValueError as error:
            return err_response("Value Error of post: {}".format(error))
        if 'page' in content:
            page = content['page']
    articlelist = Article.objects.all().order_by('-time')
    paginator = Paginator(articlelist, 10)
    try:
        current_list = paginator.page(page)
    except InvalidPage as error:
        return err_response(error)
    # coping with the paginator
    ...
    newsnum = len(Article.objects.all())
    return JsonResponse({
        'newsnum': newsnum,
        'pagelist': list(pagelist),
        'data': [{
            'title': newsitem.title,
            'source': newsitem.source,
            'time': newsitem.time.strftime("%Y-%m-%d %H:%M:%S"),
            'content': newsitem.content,
            'href': newsitem.href,
            'image': newsitem.image,
        } for newsitem in current_list]
    }, status=200)

When I use pytest-django to test it

@pytest.mark.django_db
def test_view_news(client):
    """
    Test view news
    """
    url = reverse("news")
    data = {
        'page': 1
    }
    response = client.post(url, data=data)
    assert response.status_code == 200

It gives Bad Request and code 400. But when I use client.get(), the response is normal (code 200).In the settings, I already set

DEBUG = True
ALLOWED_HOSTS = ['*']

Can anyone tells me what happened?

1 Answers

Override the default server_name used by client

Just override the default server name used by client to match one of those you have in allowed hosts e.g

ALLOWED_HOSTS = ['localhost',...]
...
.....
response = client.post(url, data, SERVER_NAME='localhost')
Related