首页 > 解决方案 > Django - 一次测试多个视图

问题描述

我可以针对一种条件测试多个视图吗?例如,如果所有这些视图都使用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.

标签: pythondjangounit-testingdjango-viewsdjango-testing

解决方案


这个答案的两个部分:

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

  2. 您一次不应测试多个单独的视图。它们被称为单元测试是有原因的。您正在测试单个单元的单个行为。我会将它设置在每个视图都有自己的TestCase类的地方。然后,对于这些测试用例中的每一个,测试该单个视图在未登录的情况下是否重定向。因此,您最终会TestCase为每个视图提供一个测试方法。因此,您将拥有一个或多个测试方法来测试每个视图的登录验证。

单元测试背后的理念是每个测试应该只测试一小部分行为。为确保您这样做,每个测试方法应该只有 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 的反向名称。我从来没有这样做过。


推荐阅读