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

问题描述 投票:0回答:1

我希望通过以下测试,但总是收到 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()))

django django-rest-framework django-testing
1个回答
0
投票

有几点需要注意:

如果您希望路由仅在运行测试时存在/注册,您可以有条件地添加它。这样做的一个好方法是:

  • 有不同的settings文件(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)
    
© www.soinside.com 2019 - 2024. All rights reserved.