我目前正在学习如何为Django应用程序编写测试。 教程视频中的那个人为其应用程序编写了以下测试:
def test_product_url(self):
path = reverse('product_detail')
self.assertEqual(resolve(path).view_name, 'product_detail')
我不知道此测试的意义。它只是测试django解析功能是否正常工作?
答案 0 :(得分:2)
Django提供了某些功能来根据视图名称(可选地带有参数)生成URL:reverse(..)
[Django-doc]函数。此外,使用resolve(..)
[Django-doc]函数则相反:它根据给定的URL计算将要调用的 path ,并返回包含视图名称的ResolverMatch
对象作为对该功能等的参考。
如果这两个功能正确实现-我们作为开发人员无法控制的事情,因为我们使用 Django(当然,其中一个可以修复错误并创建票证) Django开发团队,但现在让我们忽略它),看起来这两个函数彼此是“ inverses ”。但是,可能会有一些疑问。
首先,此处的测试隐式检查具有给定名称的视图是否存在:如果不再存在该视图,则反向查找将失败并引发错误。因此,该测试可确保例如不会偶然地重命名视图。
此检查的另一件事是,视图和URL之间的关系是可注入的:如果有两个视图生成相同 URL,则该函数不是可注入的。< / p>
例如,如果存在与它们都匹配给定URL的 overlapping 路径,则resolve(..)
函数可能指向另一个URL:例如视图名称会生成一个URL /some/url
,但该路径也会在路径列表中的较早位置被一个路径覆盖,因此结果将具有不同的名称。
但是请注意,即使视图和URL之间的关系不是内含的,但这也不意味着这将引发错误:给定视图名称可能是第一个路径,因此问题不在于“检测到”。
无论此测试是否旨在检查该内容,以 ad hoc 方式进行检查都不是一个好主意:万一要保证所有视图都有名称,等等最好编写一个能够彻底检查所有路径和视图名称的测试。