使用override_settings配置DRF测试路由时遇404,期望获取全部用户接口正常
解决测试用例404错误的方案
问题出在路由配置和请求路径的两处错误,修改如下:
1. 修正Router的注册路径
router.register的第一个参数不需要带末尾斜杠,否则会生成不符合预期的URL规则。把:
router.register('api/', views.UserModelViewSet)
改成:
router.register('api', views.UserModelViewSet)
2. 修正测试中的请求URL
因为测试用的ROOT_URLCONF是当前模块,这里的app_name不会自动作为URL前缀,所以请求路径应该是/api/而不是/frontend/api/。把测试方法里的:
resp = self.client.get('/frontend/api/')
改成:
resp = self.client.get('/api/')
修改后的完整代码
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): # 修正请求路径,去掉frontend前缀 resp = self.client.get('/api/') self.assertEquals(resp.status_code, 200) print(resp.status_code, json.dumps(resp.json()))
如果确实需要保留frontend作为URL前缀,那需要在urlpatterns里添加前缀,比如:
urlpatterns = [ path('frontend/', include(router.urls)), ]
此时测试的请求路径就是/frontend/api/,同时Router注册的路径还是api(不带末尾斜杠)。
内容的提问来源于stack exchange,提问作者KIC
相关产品推荐
相关产品推荐

