You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Django的APITestCase正确运行测试及解决reverse URL问题

一、让单元测试正常运行的方法

Django只会自动执行以test_开头的测试方法,你的测试类里的create_client、get_clients等方法不符合命名规则,因此无法被识别。修改方法名即可:

class ClientTestCase(APITestCase):
    def setUp(self):
        # 保持原代码不变
        self.data = {
            "first_name": "Jimmy",
            "last_name": "Smith",
            "email": "jimmysmith@gmail.com"
        }
        self.response = self.client.post(
            reverse('client:client-list'),
            self.data,
            format="json"
        )

    def test_create_client(self):  # 新增test_前缀
        self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(Client.objects.count(), 1)
        self.assertEqual(Client.objects.get().first_name, 'Jimmy')

    def test_get_clients(self):  # 新增test_前缀
        response = self.client.get(reverse('client:client-list'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(Client.objects.count(), 1)

    def test_get_client(self):  # 新增test_前缀
        client = Client.objects.get()
        response = self.client.get(
            reverse('client:client-detail', kwargs={'pk': client.id}),
            format="json"
        )
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertContains(response, client)

    def test_update_client(self):  # 新增test_前缀
        client = Client.objects.get()
        new_data = {
            "first_name": "Bob",
            "last_name": "Marley",
            "email": "bobmarley@gmail.com"
        }
        response = self.client.put(
            reverse('client:client-detail', kwargs={'pk': client.id}),
            data=new_data,
            format="json"
        )
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(Client.objects.get().first_name, 'Bob')

    def test_delete_client(self):  # 新增test_前缀
        client = Client.objects.get()
        response = self.client.delete(
            reverse('client:client-detail', kwargs={'pk': client.id}),
            format="json"
        )
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(Client.objects.count(), 0)

修改后重新运行python manage.py test,Django就能识别并执行这些测试用例。


二、解决reverse函数的NoReverseMatch报错

你遇到的'person' is not a registered namespace报错,和测试代码中reverse('client:client-list')的问题本质一致:URL未配置命名空间和URL名称,导致reverse无法匹配路径。

步骤1:给client应用配置命名空间和URL名称

修改client/urls.py,添加app_name并为每个URL设置name:

app_name = 'client'  # 设置应用命名空间

urlpatterns = [
    path('clients', ClientView.as_view(), name='client-list'),  # 给列表URL命名
    path('clients/<int:pk>', ClientView.as_view(), name='client-detail'),  # 给详情URL命名
]

步骤2:在项目路由中绑定命名空间(可选但推荐)

修改project/urls.py,在include时指定namespace:

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

完成后reverse('client:client-list')就能正确生成对应URL。

注:报错中提到的person命名空间,检查是否存在其他person应用的测试代码,按同样方法修复即可。


三、验证reverse生成的URL是否正确的方法

  1. Django Shell测试
    运行python manage.py shell,在交互式环境中直接调用reverse:
from django.urls import reverse
print(reverse('client:client-list'))  # 应输出 '/clients'
print(reverse('client:client-detail', kwargs={'pk': 1}))  # 应输出 '/clients/1'

若能正常输出路径,说明配置正确;若报错,根据提示排查命名空间或名称的问题。

  1. 测试中临时打印验证
    在测试方法中添加打印语句,查看生成的URL:
def test_create_client(self):
    url = reverse('client:client-list')
    print(f"Generated URL: {url}")
    self.response = self.client.post(url, self.data, format="json")
    # 原断言代码不变

运行测试时可看到生成的URL,手动访问(如开发服务器启动后访问http://localhost:8000/clients)验证是否返回预期响应。

  1. 用Django检查命令排查
    运行python manage.py check,Django会自动检查URL配置的语法错误或命名冲突,提前发现问题。

内容的提问来源于stack exchange,提问作者Nurzhan Nogerbek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:40:35