如何测试在 Django 中使用 post 请求的视图?

How to test views that use post request in django?

这是我的观点(简化版):

@login_required(login_url='/try_again')
def change_bar(request):
    foo_id = request.POST['fid']
    bar_id = request.POST['bid']
    foo = models.Foo.objects.get(id=foo_id)
    if foo.value > 42:
            bar = models.Bar.objects.get(id=bar_id)
            bar.value = foo.value
            bar.save()
    return other_view(request)

现在我想检查这个视图是否正常工作(在这个简化的模型中,如果 Bar 实例在它应该改变值的时候)。我该怎么做?

您可以尝试在代码之间放置 "print" 语句,看看是否保存了正确的值。此外,对于更新而不是使用 "get" 查询然后保存它 (bar.save()),您可以使用 "filter" 和 "update" 方法。

@login_required(login_url='/try_again')
def change_bar(request):
foo_id = request.POST['fid']
bar_id = request.POST['bid']
foo = models.Foo.objects.get(id=foo_id)
if foo.value > 42:
        models.Bar.objects.filter(id=bar_id).update(value=foo.value)
        #bar.value = foo.value
        #bar.save()
return other_view(request)

我假设您指的是自动化测试,而不是仅仅检查 post 请求是否有效。如果您的意思是后者,只需通过执行请求并在 shell 或管理员中检查相关 FooBar 的值来检查。

发送 POST 请求的最佳方式是使用 Client。假设视图的名称是 my_view:

from django.test import Client
from django.urls import reverse

c = Client()
c.post(reverse('my_view'), data={'fid':43, 'bid':20})

但是您仍然需要数据库中的一些初始数据,并且您需要检查是否进行了您希望进行的更改。这是您可以使用 TestCase:

的地方
from django.test import TestCase, Client
from django.urls import reverse

FooBarTestCase(TestCase):

def setUp(self):
    # create some foo and bar data, using foo.objects.create etc
    # this will be run in between each test - the database is rolled back in between tests

def test_bar_not_changed(self):
    # write a post request which you expect not to change the value 
    # of a bar instance, then check that the values didn't change
    self.assertEqual(bar.value, old_bar.value)

def test_bar_changes(self):
    # write a post request which you expect to change the value of 
    # a bar instance, then assert that it changed as expected
    self.assertEqual(foo.value, bar.value)

我发现一个有助于设置一些数据以更轻松地执行测试的库是 FactoryBoy。在创建 FooBar 的新实例以进行测试时,它减少了样板文件。另一种选择是编写固定装置,但我发现如果您的模型发生变化,灵活性会降低。

如果您想了解有关 python 中测试的更多信息,我也推荐 this book。它是面向 django 的,但原则适用于其他框架和上下文。

编辑:将关于 factoryboy 和 link 的建议添加到书本