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

How to properly test Django API ListView with PyTest?

我有一个 API ListView 端点,当我用 Postman 拍摄时它工作正常,但 returns 空查询集和测试状态 404:

测试结果:

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

我使用 pytest fixture 创建我的对象:

conftest.py


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

夹具在其他(不是 API)测试中工作正常,所以我相信问题可能出在我测试 API 的方式上。在 pycharm 调试器中,我可以看到视图已执行,所以这不是 url 问题。

在 postman 中,此端点正确 returns 具有事件对象和状态 200 的 json。

test_api.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

views.py

from rest_framework.generics import ListAPIView

from event_finder.models import Event
from event_finder.serializers import EventSerializer


class ListView(ListAPIView):
    queryset = Event.objects.all()
    serializer_class = EventSerializer

这是一个非常简单的例子。但也许你可以让它像这样工作:

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)

希望对您有所帮助。

好吧,显然我是个白痴,问题完全不同。我的 URL 最后因为 / 没用。更改为:

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

而且效果很好。不知道为什么我之前没有发现,我使用 Pycharm 调试器 运行 遍历了整个应用程序并执行了视图。

老实说,看完后 the docs 我很惊讶我的灯具能正常工作。根据文档,我应该将 db 夹具添加到我的夹具中,但没有它它也能正常工作。

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