Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在DRF中测试API端点-按名称访问特定url?_Python_Django_Django Rest Framework_Django Testing - Fatal编程技术网

Python 在DRF中测试API端点-按名称访问特定url?

Python 在DRF中测试API端点-按名称访问特定url?,python,django,django-rest-framework,django-testing,Python,Django,Django Rest Framework,Django Testing,我有一个结构如下的项目: 计划 附件1 附件2 每个应用程序都使用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/', i

我有一个结构如下的项目:

  • 计划
    • 附件1
    • 附件2
每个应用程序都使用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)),
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)
在我的
rest\u api.py
文件中,我设置了以下路由:

router = routers.DefaultRouter()
router.register(r'myspecificmodel',
                MySpecificModelViewSet, base_name='MySpecificModels')
router.register(r'myothermodels', MyOtherModelsViewSet,
                base_name='MyOtherModels')
我在
app1/tests
目录中有一个
test\u api.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)),
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响应永久重定向


我最好如何测试该API端点?是否有一种方法可以命名路由并使用
反向测试它,因为这可能会更容易一些?

遵循重定向链直到结束:

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

参考资料:

Argh。当我这样做时,我得到一个
404
返回。真倒霉如果我在浏览器中点击URL,我会得到预期的结果。也许这与URL中的尾随/开头斜杠有关。@Hanny我建议您命名URL模式并使用reverse()以获得所需的URL。得到更可靠的测试更好。看看这个问题,你就会明白我的意思:这就是
basename
的用途吗?当我执行
reverse('MySpecificModels')
时,它找不到任何东西,所以我想它找不到-但是我在
router.register
行中找不到多少关于如何正确命名路由的文档。我很欣赏这个链接,我认为你的答案是正确的,所以我会将它标记为正确的。另一方面,我要指出的是那些可能会无意中发现这个链接的人:即使使用
reverse('MySpecificModels-list')
,文档仍然会给出404错误-尽管找到了合适的URL(在应用程序的URL中列出)。