django 我想添加一个仅用于测试的DRF API路由(override_settings),得到404

utugiqy6  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(215)

我希望下面的测试通过,但我总是得到一个404错误。但我希望“获取所有”请求返回所有用户。

import json

from django.test.utils import override_settings
from django.urls import path, include
from rest_framework import routers

from frontend.tests.mocks import views
from django.test import TestCase

app_name = 'frontend'
router = routers.SimpleRouter()
router.register('api/', views.UserModelViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

@override_settings(ROOT_URLCONF=__name__)
class TestJsonSchemaSerializer(TestCase):  # APITest doesn't work either

    def test_custom_serializer(self):
        resp = self.client.get('/frontend/api/')
        self.assertEquals(resp.status_code, 200)
        print(resp.status_code, json.dumps(resp.json()))

字符串

tmb3ates

tmb3ates1#

需要注意的几点:
如果你想让一个路由只在运行测试时存在/注册,你可以有条件地添加它。一个好的方法是:

  • 具有不同的设置文件(settings/development.py、settings/test.py等)
  • 运行测试时使用测试设置
  • 在您的测试设置中,有一个像IS_TEST=True这样的变量
  • 然后在urls.py文件中,使用此设置有条件地注册视图

最重要的是,作为良好的实践,您应该将API注册到**/API/,并将视图集注册为子路径,如/API/users/**

# Create router
router = routers.SimpleRouter()

# Register views
router.register("users", views.UserModelViewSet, "users")
# Conditionally register views
if settings.IS_TEST:
    router.register("others", views.OtherViewSet, "others")

# Expose the API
app_urls = [
    path("api/", include(router.urls)),
]

字符串
然后你可以更新:

  • 更新测试用例以丢弃override_settings
  • 运行测试与正确的设置,即python manage.py tests settings=[project].settings.test
class TestJsonSchemaSerializer(TestCase):

    def test_custom_serializer(self):
        resp = self.client.get('/api/others/')  # Assuming the `list` endpoint exists in this viewset
        self.assertEquals(resp.status_code, 200)

相关问题