我正在研究TDD中的一个Python示例,并且试图接受一个post请求。Django测试request.method =='POST'不能正常工作
Django的Request and response objects页HttpRequest.method
建议使用下面的代码段responde GET和POST不同
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
考虑到这一点,我的观点是建立像这样:
from django.shortcuts import render
from django.http import HttpResponse
from items.models import Item
def index_page(request):
name = ''
if request.method == 'POST':
name = request.POST['item']
Item.objects.create(name=name)
return render(request, 'items/index.html', {'item': name})
我的测试文件包含以下内容
from django.test import TestCase
from django.http import HttpRequest
from items.views import index_page
from items.models import Item
class IndexPageTest(TestCase):
def test_index_page_can_save_a_post_request(self):
request = HttpRequest()
request.POST['item'] = 'MyItem'
response = index_page(request)
self.assertEqual(Item.objects.count(), 1)
self.assertEqual(Item.objects.first().name, 'MyItem')
当我改变视图到其下面产生以下错误
======================================================================
FAIL: test_index_page_can_save_a_post_request (items.tests.IndexPageTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/items/tests.py", line 43, in test_index_page_can_save_a_post_request
self.assertEqual(Item.objects.count(), 1)
AssertionError: 0 != 1
然而,测试通过。
from django.shortcuts import render
from django.http import HttpResponse
from items.models import Item
def index_page(request):
name = request.POST.get('item', '')
if name:
Item.objects.create(name=name)
return render(request, 'items/index.html', {'item': name})
显然,我的页面repsonding POST请求和测试发送POST数据,但我不知道为什么if request.method == 'POST':
线不出现工作。
$ python --version
Python 3.5.2 :: Continuum Analytics, Inc.
$ django-admin --version
1.10.3
还设置'request.method ='POST'',因为你的第一个例子是基于rquest方法进行检查,并且你没有设置它 –