这个测试有意义吗?

时间:2018-08-27 18:34:09

标签: python django testing

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

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

我不知道此测试的意义。它只是测试django解析功能是否正常工作?

1 个答案:

答案 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 方式进行检查都不是一个好主意:万一要保证所有视图都有名称,等等最好编写一个能够彻底检查所有路径和视图名称的测试。