如何使用 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
夹具添加到我的夹具中,但没有它它也能正常工作。
感谢您的帮助,抱歉浪费您的时间。
我有一个 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
夹具添加到我的夹具中,但没有它它也能正常工作。
感谢您的帮助,抱歉浪费您的时间。