Django - 一次测试多个视图

时间:2018-06-01 12:45:43

标签: python django unit-testing django-views django-testing

我可以针对一种情况测试多个视图吗?例如,如果所有这些视图都使用LoginRequiredMixin@login_required装饰器?

这只适用于一个调用IndexView的网址。

class IndexTest(TestCase):
    def setUp(self):
        self.user = User.objects.create(username='testuser')

    def test_login_required(self):
        response = self.client.get(reverse("profiles:user_filter"))
        self.assertRedirects(response,reverse("account_login")+"?next={}".format(reverse("profiles:user_filter")))

我想测试除了一两个视图之外的所有视图是否都有LoginRequiredMixin所以如果我将来创建新视图,如果我忘记使用LoginRequiredMixin,测试将会失败。

1 个答案:

答案 0 :(得分:1)

这个答案的两个部分:

  1. Python单元测试非常明确。要测试多个视图,您需要发出多个请求。每个视图一个请求。你可以将反向名称放在一个列表中并循环遍历它们并为循环中的每一个做一个断言。

  2. 您不应该一次测试多个单独的视图。他们称之为单元测试是有原因的。您正在针对个人行为测试单个单元。我会在每个视图都有自己的TestCase类的地方进行设置。然后,对于每个测试用例,如果没有登录,请测试该个别视图是否重定向。因此,您最终会为每个视图安装一个带有测试方法的TestCase,因此,您将拥有一个或多个测试方法,测试每个视图的登录验证。

  3. 单元测试背后的哲学是每个测试应该只测试一小部分行为。为确保您这样做,每个测试方法只应有1个断言。只有在极端情况下,你才能拥有多个,如果是这样的话,它们应该在逻辑上彼此非常相连。

    ---------------------------------------编辑------- ------------------------------

    如果您想知道哪些视图没有login_required / LoginRequiredMixin实现,我认为除了通过编辑器搜索引擎进行搜索之外,还有什么可以帮助您。我可能是错的,所以我不是肯定的,但我认为你只需要使用文件搜索。

    您可以编写一个脚本,查看所有url.py文件并循环遍历每个URL:

    for url in app1.urls.urlpatterns: # loop through urls in "urlpatterns = [url(...), url(...), ...]"
        url_name = <get_url_name_from_pattern>
        response = # request to url without login
        if response.status_code = 302: print "this view has login required"
        else: print "this view doesn't have login required"
    
    for url in app2.urls.urlpatterns: # loop through urls in "urlpatterns = [url(...), url(...), ...]"
        url_name = <get_url_name_from_pattern>
        response = # request to url without login
        if response.status_code = 302: print "this view has login required"
        else: print "this view doesn't have login required"
    
    for url in app3.urls.urlpatterns: ...
    

    您必须查找如何获取urlpattern的反向名称。我从来没有这样做过。

相关问题