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에 대한 유효성 검사를 할의는 단순히 템플릿을 렌더링이 기능을 기반 뷰 있다고 가정 해 봅시다.

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

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

이제 기본적으로 동일한 시험 방법이 실패 :

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' 

I에서

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

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

결과 지금은 TemplateView에서 상속 클래스 기반보기로 위를 변환하고 싶습니다 'request.method을 수동으로 GET으로 설정하려고했으나 session에 대해 불평하는 또 다른 오류가 발생했습니다. request.

"빈"요청으로 TemplateView에서 응답을받는 방법이 있습니까?

+0

http://stackoverflow.com/questions/8603035/how-tdd-can-be -applied-to-django-class-based-generic-views – dm03514

답변

4

감사합니다. dm03513 포인터! 사실 내가 requestsession (SessionMiddleware에도 불구하고 상장되는 첫번째)이 포함되어 있는지 확인도 RequestFactory를 사용하지만했다 :

# 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

2

대신 인스턴스 및보기에 직접

테스트 클라이언트를 호출, 이러한 목표를 달성하기 위해 테스트 client 내장 djangos를 사용할 수는 추가로이

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

장고 URL의 라우터를 통해 요청을 할 수 있습니다 몇 가지 blogposts 중 하나가 클래스 기반 뷰를 테스트하는 방법을 만지는 것을 발견했습니다. 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 단위 테스트보다 더 기능적인 (브라우저로 시뮬레이션하는 것보다는) 함수를 가지고 놀아 보는 것과는 대조적으로, 나는이 경우에 정말로 중요하지 않다고 생각하지만, 둘 다 가능하다는 것을 아는 것이 좋다! –

+0

두 번째 생각에,이 경우 클라이언트를 사용하는 것이 유일한 방법 일 수는 없습니다. –