相关文章推荐
烦恼的跑步鞋  ·  如何在 WordPress ...·  1 周前    · 
聪明的小熊猫  ·  试图将.net ...·  6 月前    · 
体贴的柳树  ·  Getting Error Code: ...·  9 月前    · 

处理完POST请求后重定向

代码中new_item_text = ''的写法不怎么样。解决第二个问题时候,顺带把这个问题也解决了。

人们都说处理完post请求后一定要重定向,接下来就实现这个功能吧。修改针对保存POST请求数据的单元测试,不让它渲染包含待办事项的响应,而是重定向到首页。

lists/tests.py
    def test_can_save_a_post_request(self):
        response = self.client.post('/', data={'item_text': 'A new list item'})
        self.assertEqual(Item.objects.count(), 1)
        new_item = Item.objects.first()
        self.assertEqual(new_item.text, 'A new list item')
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['location'], '/')

不需要再拿响应中的.content 属性值和渲染模板得到的结果比较,因此把相应的断言删掉了。现在,响应是HTTP重定向,状态码是302,让浏览器指向一个新地址。修改之后运行结果200!=302,现在可以大幅度清理视图函数了

from django.shortcuts import render, redirect
from lists.models import Item
from django.http import HttpResponse
# Create your views here.在这儿编写视图
def home_page(request):
    if request.method == 'POST':
        Item.objects.create(text=request.POST['item_text'])
        return redirect('/')
    return render(request,'home.html')

现在测试可以通过了python manage.py test

----------------------------------------------------------------------
Ran 5 tests in 0.012s
Destroying test database for alias 'default'...

更好的单元测试实践方法,一个测试只测试一件事

单元测试实践方法要求,一个测试只能测试一件事,因为这样便于查找问题。如果一个测试中有多个断言,一旦前面的断言导致失败,就无法得知后面的断言情况如何(如,如果不小心破坏了视图函数,我们想知道到底是保存对象时出错了,还是响应的类型出错了)

刚开始可能无法写出只有一个断言的完美单元测试,不过现在可以把正在开发的功能分开测试(上面一个功能分为两个)。

#lists/tests.py

def test_can_save_a_post_request(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertEqual(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEqual(new_item.text, 'A new list item') def test_redirects_after_POST(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/')

现在运行应该看见有六个测试通过,而不是五个。

----------------------------------------------------------------------
Ran 6 tests in 0.014s
Destroying test database for alias 'default'...