2016-11-22 180 views
0

我正在研究TDD中的一个Python示例,并且试图接受一个post请求。Django测试request.method =='POST'不能正常工作

Django的Request and response objectsHttpRequest.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 
+0

还设置'request.method ='POST'',因为你的第一个例子是基于rquest方法进行检查,并且你没有设置它 –

回答

1

您的测试不是发送一个职位。您应该使用RequestFactory而不是直接实例化HttpRequest。或者甚至更好,使用内置的测试客户端。

+0

我正在查看客户端,但'name = request'如何。如果'HttpRequest'没有发送POST数据,POST.get('item','')'返回正确的值吗? –

+0

也许测试通过了,因为你自己创建了请求对象,并且只添加了'item'键。因此,当您将该请求传递给第二个视图时,它会为您指定的“item”找到一个值,并创建Item对象。但 – Stonecold

+0

好吧,你添加了一个项目request.POST,所以当然这是有效的。但是这并不会改变请求方法。 –