gpt4 book ai didi

python - Django - 一次测试多个 View

转载 作者:行者123 更新时间:2023-12-01 01:51:50 25 4
gpt4 key购买 nike

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

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

最佳答案

这个答案分为两个部分:

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

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

单元测试背后的理念是每个测试应该只测试一小部分行为。为了确保您这样做,每个测试方法应该只有 1 个断言。只有在极端情况下才应该有多个,如果是这样,它们在逻辑上应该彼此紧密相连。

<小时/>

如果您想知道哪些 View 没有 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 的反向名称。我从来没有这样做过。

关于python - Django - 一次测试多个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com