4

我正在嘗試編寫一個測試,用於驗證從泛型類視圖返回的HTML。比方說,我有這個基於函數的觀點,只是呈現一個模板:從基於類的通用視圖手動獲取響應

# views.py 
from django.shortcuts import render 

def simple_view(request, template='template.html'): 
    return render(request, template) 

就這樣,我的測試過程中可以只是做:

# tests.py 
from django.http import HttpRequest 
from .views import simple_view 

request = HttpRequest() 
response = simple_view(request) 

,然後做對response驗證。現在,我想上述轉換爲基於類的視圖從TemplateView繼承:

# views.py 
from django.views.generic import TemplateView 

class SimpleView(TemplateView): 
    template_name = 'template.html' 

現在基本上是相同的測試方法失敗:

# tests.py 
from django.http import HttpRequest 
from .views import SimpleView 

request = HttpRequest() 
view_func = SimpleView.as_view() 
response = view_func(request).render() 

結果

Traceback (most recent call last): 
    File "tests.py", line 30, in test_home_page_returns_correct_html 
response = view_func(request).render() 
    File "lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view 
return self.dispatch(request, *args, **kwargs) 
    File "lib/python2.7/site-packages/django/views/generic/base.py", line 82, in dispatch 
if request.method.lower() in self.http_method_names: 
AttributeError: 'NoneType' object has no attribute 'lower' 

我已經嘗試手動設置request.methodGET,但這只是提出了另一個錯誤,抱怨session不在request

有沒有辦法通過TemplateView以「空」請求獲得響應?

+0

http://stackoverflow.com/questions/8603035/how-tdd-can-be -applied-to-django-class-based-generic-views – dm03514 2013-04-21 16:13:35

回答

4

謝謝dm03513爲指針!事實上,我不得不使用RequestFactory,也確保request包含一個空session(儘管SessionMiddleware被列在第一位):

# tests.py 
from django.test import TestCase 
from django.test.client import RequestFactory 

class SimpleTest(TestCase): 
    def setUp(self): 
     self.factory = RequestFactory() 

    def test_home_page_returns_correct_html(self): 
     request = self.factory.get('/') 
     request.session = {} 
     view_func = SimpleView.as_view() 
     response = view_func(request) 
     response.render() 
     self.assertIn('<html>', response.content) 
+1

request.session = {}在我的測試中失敗。我按照如下要求在請求上設置了會話並且它工作了(當然,根據需要首先導入模塊):request.session = django.utils.importlib.import_module(django.conf.settings.SESSION_ENGINE).SessionStore(None)[I結合你的答案和這個問題的答案。](http://stackoverflow.com/questions/16865947/django-httprequest-object-has-no-attribute-session) – DMfll 2014-06-20 12:34:12

2

你可以使用內置的測試client Django的做到這一點,而不是實例化和調用視圖直接

測試客戶端使您可以通過Django的網址路由器

response = self.get('/url/to/invoke/simpleview/')

此外,還有的請求我發現了一些關於如何測試基於類的視圖的博客帖子,其中之一是http://tech.novapost.fr/django-unit-test-your-views-en.html

+0

確實如此,正如這裏所指出的:http://stackoverflow.com/questions/8603035/how-tdd-can-be-applied-to-django-class基於泛型的視圖比單元測試更有用(你正在模擬一個瀏覽器,而不是僅僅使用函數)。我想在這種情況下並不重要,但知道兩者都是可能的! – 2013-04-21 16:54:24

+0

第二個想法是,在這種情況下使用客戶端可能更加安全,如果不是唯一的方式! – 2013-04-22 10:39:04

相關問題