如何使用PyTest正确测试Django API ListView?

时间:2019-12-18 07:24:54

标签: python django django-rest-framework pytest pytest-django

我有一个API ListView端点,当我用Postman拍摄它时可以正常工作,但是在测试中返回空的查询集和状态404:

测试结果:

multipartFormData.append(imageData,
                         withName: "image",
                         fileName: "image.jpg",
                         mimeType: "image/jpeg")

我使用pytest固定装置创建对象:

conftest.py

web_1  | >       assert response.status_code == 200
web_1  | E       assert 404 == 200

固定装置在其他(不是API)测试中可以正常工作,因此我认为问题可能出在我测试API的方式上。在pycharm调试器中,我可以看到该视图已执行,因此这不是URL问题。

在邮递员中,此端点正确返回一个带有事件对象和状态200的json。

test_api.py


@pytest.fixture
def event(system, new_conflict):
    return Event.objects.create(
        system=system,
        event_type='new_conflict',
        details=new_conflict
    )

views.py


from rest_framework.test import APIClient

from event_finder.models import Event
import pytest


@pytest.mark.django_db
def test_list_events_all(event):
    client = APIClient()
    response = client.get(path='/api/events/', format='json')

    assert response.status_code == 200

2 个答案:

答案 0 :(得分:0)

这是一个非常简单的示例。但是也许您可以使它像这样工作:

from rest_framework.test import APITransactionTestCase
from rest_framework.test import status

class TestThis(APITransactionTestCase):
    def test_this(self):
        data = {"key": "value"}
        response = self.client.post("/api/resource", data=data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

我希望它会有所帮助。

答案 1 :(得分:0)

好的,显然我是个白痴,问题完全不同。我的网址由于最后/而无法使用。更改为:

response = client.get(path='/api/events',
                          format='json')

,效果很好。不知道为什么我以前没有抓住它,我正在使用Pycharm调试器运行整个应用程序,并执行了视图。

说实话,在阅读the docs之后,我很惊讶我的装置作品。根据文档,我应该将db灯具添加到我的灯具中,但是没有它也可以正常工作。

感谢您的帮助,并浪费您的时间。