首页 > 解决方案 > 这个测试有意义吗?

问题描述

我目前正在学习如何为 Django 应用程序编写测试。教程视频中的那个人为他的应用程序编写了以下测试:

def test_product_url(self):
    path = reverse('product_detail')
    self.assertEqual(resolve(path).view_name, 'product_detail')

我不明白这个测试有什么意义。它只是测试 django 解析功能是否正确工作?

标签: pythondjangotesting

解决方案


测试做什么

Django 提供了某些函数来从视图名称(可选地带有参数)生成 URL:reverse(..)[Django-doc]函数。resolve(..)此外, [Django-doc]函数则相反:它从给定的 URL 计算将调用的路径ResolverMatch,并返回一个包含视图名称的对象,以及对函数的引用等。

如果这两个功能都正确实现了——这是我们作为开发人员无法控制的事情,因为我们使用Django(当然可以修复错误并为 Django 开发团队创建票证,但现在让我们忽略它),它看起来像如果这两个函数是彼此的“倒数”。然而,可能会有一些特殊性。

测试可能失败的情况

首先,这里的测试隐式地检查具有给定名称的视图是否存在:如果不再存在这样的视图,反向查找将失败,并引发错误。因此,该测试可确保例如不会意外地重命名视图。

它检查的另一件事是视图和 URL 之间的关系是单的:如果有两个视图产生相同的URL,则该函数不是单射的。

例如,如果在某种意义上存在重叠路径,它们都与给定的 URL 匹配,那么resolve(..)函数可能会指向另一个 URL:例如,如果视图名称生成一个 URL /some/url,但该路径被之前的路径覆盖在路径列表中,则结果将具有不同的名称。

但是请注意,即使视图和 URL 之间的关系不是单射的,这仍然不意味着这会引发错误:给定的视图名称可能是第一个路径,因此该问题未被“检测到”。

不管这个测试是否打算检查这个,以一种特别的方式检查这个不是一个好主意:以防万一想要保证所有视图都有一个名称等。最好编写一个详尽的测试检查所有路径和视图名称。


推荐阅读