【问题标题】:Testing API endpoint in DRF - accessing the specific url by name?在 DRF 中测试 API 端点 - 按名称访问特定 url?
【发布时间】:2019-09-14 02:50:00
【问题描述】:

我有一个具有以下结构的项目:

  • 项目
    • app1
    • app2

每个应用都在使用 django rest 框架。

我的项目urls.py 文件如下所示:

import app1.rest_api

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app2/', include('app2.urls')),
    path('app1/', include('app1.urls')),
    path('api/app1/', include(
        app1.rest_api.router.urls)),

在我的rest_api.py 文件中,我设置了以下路线:

router = routers.DefaultRouter()
router.register(r'myspecificmodel',
                MySpecificModelViewSet, base_name='MySpecificModels')
router.register(r'myothermodels', MyOtherModelsViewSet,
                base_name='MyOtherModels')

我在app1/tests 目录中有一个test_api.py 文件,如下所示:

from rest_framework import status
from rest_framework.test import APITestCase, APIClient


class URLTest(APITestCase):
    def setUp(self):
        self.client = APIClient()

    def test_url_returns_200(self):
        url = '/api/app1/myspecificmodels'
        response = self.client.get(url)
        # response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 1)

这给我一个301 ResponsePermanentRedirect

如何最好地测试该 API 端点?有没有办法命名路线并使用reverse 对其进行测试,因为这样可能会更容易一些?

【问题讨论】:

    标签: python django django-rest-framework django-testing


    【解决方案1】:

    跟随重定向链直到结束:

    response = self.client.get(url, follow=True)
    

    参考:Test tools, Making requests

    【讨论】:

    • 啊。当我这样做时,我得到一个 404 返回。真可惜。如果我在浏览器中点击 URL,我会得到预期的结果。也许这与 URL 中的尾随/开头斜杠有关。
    • @Hanny 我建议您命名您的 URL 模式并使用 reverse() 以获得所需的 URL。更好地获得更强大的测试。看看这个问题,你就会明白我的意思:stackoverflow.com/questions/12818377/…
    • 这就是basename 的用途吗?当我做reverse('MySpecificModels') 时,它什么也找不到,所以我想它不是——但我找不到太多关于如何在router.register 行中正确命名路线的文档。我很欣赏这个链接,我认为你的答案是正确的,所以我会这样标记它。
    • 作为可能偶然发现此问题的人的另一点:即使根据文档使用reverse('MySpecificModels-list') 仍然会出现 404 错误 - 尽管找到了适当的 URL(在应用程序的 URL 中列出) .
    猜你喜欢
    • 2014-12-10
    • 2016-04-05
    • 2020-09-02
    • 2013-01-27
    • 2016-03-16
    • 1970-01-01
    • 2017-10-01
    • 2014-02-19
    • 2017-08-12
    相关资源
    最近更新 更多