【问题标题】:Django - test multiple views at onceDjango - 一次测试多个视图
【发布时间】:2018-11-11 14:47:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这个答案的两个部分:

    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 的反向名称。我从来没有这样做过。

    【讨论】:

    • 感谢您的回答。我知道单元测试不是办法。我想要的是:告诉我的东西(模块,测试或......),如果我的项目中有一些视图(列出的除外)不扩展 LoginRequiredMixin 所以我不必检查每个视图一。
    猜你喜欢
    • 2013-10-30
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2022-01-07
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多