2017-08-09 39 views
0

所以我在用Django進行TDD,而且我被困在以下問題上。從TestCase的Django - TDD:'HttpRequest'沒有'POST'屬性

def test_home_page_can_save_POST_request(self): 
    request = HttpRequest 
    request.method = 'POST' 
    request.POST['item_text'] = 'A new list item' 

    response = home_page(request) 

    self.assertIn('A new list item', response.content.decode()) 

試驗方法和我收到提示爲:

request.POST['item_text'] = 'A new list item' 
AttributeError: type object 'HttpRequest' has no attribute 'POST' 

但HttpRequest的具有屬性 'POST' 按Django文檔。

Thansk guys!

回答

1

你忘了括號HttpRequest :)

後,這就是爲什麼Django是說HttpRequest has no attribute 'POST'

+0

感謝隊友,我一直在試圖解決它與不同模塊的幾個小時。該死的這些括號或分號:D – MacR

0

測試時,如果你需要一個請求對象,你也可以使用請求工廠生成一個

從文檔參考: https://docs.djangoproject.com/en/1.11/topics/testing/advanced/

from django.contrib.auth.models import AnonymousUser, User 
from django.test import TestCase, RequestFactory 

from .views import MyView, my_view 

class SimpleTest(TestCase): 
    def setUp(self): 
     # Every test needs access to the request factory. 
     self.factory = RequestFactory() 
     self.user = User.objects.create_user(
      username='jacob', email='[email protected]…', password='top_secret') 

    def test_details(self): 
     # Create an instance of a GET request. 
     request = self.factory.get('/customer/details') 

     # Recall that middleware are not supported. You can simulate a 
     # logged-in user by setting request.user manually. 
     request.user = self.user 

     # Or you can simulate an anonymous user by setting request.user to 
     # an AnonymousUser instance. 
     request.user = AnonymousUser() 

     # Test my_view() as if it were deployed at /customer/details 
     response = my_view(request) 
     # Use this syntax for class-based views. 
     response = MyView.as_view()(request) 
     self.assertEqual(response.status_code, 200) 

在你的情況下,你的測試可能看起來像這樣:

from django.test import RequestFactory 

... 

def test_home_page_can_save_POST_request(self): 
    factory = RequestFactory() 
    response = factory.post('PATH_TO_YOUR_VIEW', data={ 
     'item_text': 'A new list item', 
    }) 
    self.assertIn('A new list item', response.content.decode()) 
+0

謝謝,我絕對會考慮這一點。到目前爲止,我正在關注一本書並學習TDD – MacR

0

你應該考慮使用RequestFactory作爲測試用例。從文檔

例子:

from django.contrib.auth.models import AnonymousUser, User 
from django.test import TestCase, RequestFactory 

from .views import MyView, my_view 

class SimpleTest(TestCase): 
    def setUp(self): 
     # Every test needs access to the request factory. 
     self.factory = RequestFactory() 
     self.user = User.objects.create_user(
      username='jacob', email='[email protected]…', password='top_secret') 

    def test_details(self): 
     # Create an instance of a GET request. 
     request = self.factory.get('/customer/details') 

     # Recall that middleware are not supported. You can simulate a 
     # logged-in user by setting request.user manually. 
     request.user = self.user 

     # Or you can simulate an anonymous user by setting request.user to 
     # an AnonymousUser instance. 
     request.user = AnonymousUser() 

     # Test my_view() as if it were deployed at /customer/details 
     response = my_view(request) 
     # Use this syntax for class-based views. 
     response = MyView.as_view()(request) 
     self.assertEqual(response.status_code, 200) 
相關問題