2015-02-04 2 views
1

django 테스트 더미 클라이언트를 사용하여 장고에 custom handler404 및 handler500에 대한 몇 가지 테스트를 작성해야합니다. 첫 번째 문제는 두 번째 문제가있는 동안 테스트하기 쉽습니다.장고 테스트 클라이언트가 예외를 처리하지 않습니까?

기본적으로 문제는 Django 테스트 클라이언트가 예외를 catch하지 않으며 적절한 처리기로 라우팅하지 않는다는 것입니다. 올바른 사용자 지정 처리기 및 템플릿이 사용되는지 테스트해야하기 때문에이 문제가 발생합니다.

우리는 테스트를 위해 예외를 시뮬레이션하는 간단한 미들웨어 클래스가 :

class HTTPStatusCodeMiddleware(object): 
    def process_view(self, request, *args): 
     if 'cookie_500_error' in request.COOKIES: 
      raise Exception('Test exception') 

위의 코드는 브라우저에서 수동 테스트를 위해 잘 작동합니다.

지금, 테스트는 다음과 같습니다

def test_404_template(self):             
     c = Client()                
     url = '/not_existing.html'            
     response = c.get(url)              
     self.assertEqual(response.status_code, 404) # success     
     self.assertTemplateUsed(response, 'custom/404.html') # success 

    def test_500_template(self):             
     c = Client()                
     c.cookies['cookie_500_error'] = '1'         
     response = c.get('/') # here middleware raises exception!!! 
     self.assertEqual(response.status_code, 500) 
     self.assertTemplateUsed(response, 'custom/500.html') 

어떤 생각? 셀렌을 사용할 수있는 옵션이 없습니다. 감사합니다.

답변

3

장고 테스트 클라이언트는 일부 예외 만 처리합니다 (the docs 참조). 다른 모든 것들은 테스트에서 볼 수 있고 테스트 할 수 있습니다.)

+0

전 행동하라. 500을 얻기 위해 SystemExit()을 발생시키는 더미 인터페이스를 생성 할 수 있습니다. 테스트 클라이언트가 나타내는 동작은 잘못되었거나 잘못된 입력에 대해 올바른 예외가 발생했는지 확인하기위한 것입니다. – bmhkim

+1

답해 주셔서 감사합니다. 어쨌든 실제로 추가하려는 테스트는 현재 설정에 따라 실제로 올바른 handler500 뷰가 사용되고 있는지 확인해야합니다. 내가 어떻게 주장 할 수 있니? – BangTheBank

+0

그런 다음 실제 서버 인스턴스 (예 : dev 서버)를 실행하고 실제 http 요청 (self.live_server_url + reverse ('viewname'))을 수행하는 LiveServerTestCase를 사용합니다. 그러나 HttpResponse 인스턴스가 아닌 렌더링 된 페이지를 얻을 수 있으므로 응답 콘텐트를 테스트하기 위해 라이브러리로 파싱해야한다. – Bruce

0

그래서 django 테스트 클라이언트 클래스는 설계 상 예외를 catch하지 않으며 이는 좋은 것입니다.

문제는 request.urlconf 변수를 사용자 지정 urlconf 모듈로 ​​바꿈으로써 특정 설정에 대해 사용자 지정 미들웨어가 설정 한 사용자 지정 handler500을 테스트하는 것이기 때문에 해결 방법은 RequestFactory를 사용하여 요청을 작성하고 테스트 요청 .urlconf.handler500 뷰 : 사용자에

/CLIENT1/urls.py 테스트 /보기/test_error_pages.py에

def handler500(request): 
    data = {'client', 'client1 is sorry!'} 
    ctx = RequestContext(request) 
    content = render_to_string('client1/500.html', data, ctx) 
    return http.HttpResponseServerError(content) 

def test_500_template(self): 
    req = RequestFactory().get('/') 
    req.user = AnonymousUser() 
    req.session = {} 

    cust_mw = CustomUrlconfMiddleware() 
    cust_mw.process_request(req) # set the custom request.urlconf 
    urlconf = importlib.import_module(req.urlconf) 
    response = urlconf.handler500(req) 
    self.assertEqual(response.status_code, 500) 
    assert_str = '/static/img/custom/client1/' 
    self.assertTrue(assert_str in response.content, 
        msg='500 template is not for client1. String {} is not in content'.format(assert_str)) 
관련 문제