2015-02-04 2 views
1

Мне нужно написать несколько тестов для пользовательских handler404 и handler500 в Django, используя django test dummy client. Первое легко проверить, пока у меня проблемы со вторым.Клиент Django test не обрабатывает исключения?

В основном проблема заключается в том, что клиентский тестовый клиент Django не обнаруживает исключения и не направляет соответствующий обработчик. Это проблема, потому что нам нужно проверить, что используются правильный пользовательский обработчик и шаблон.

У нас есть простой класс промежуточного слоя для имитации исключений для испытаний:

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

Клиент Django test обрабатывает только некоторые исключения (см. the docs). Все остальные видны в тесте, и вы можете их протестировать;)

+0

Ex actly. Вам понадобится создать фиктивный интерфейс, который вызывает SystemExit(), чтобы получить 500. Поведение, проявленное тестовым клиентом, является конструктивным, чтобы можно было проверить, что правильное исключение возбуждено на недопустимых/ошибочных входах. – bmhkim

+1

Спасибо за ответ. В любом случае, тест, который я хочу добавить, должен проверить, что используется режим right handler500 (в зависимости от текущих настроек). Как я могу это утверждать? – BangTheBank

+0

Затем используйте LiveServerTestCase, который запускает экземпляр реального веб-сервера (например, dev-сервер) и выполняет настоящий HTTP-запрос (self.live_server_url + reverse ('viewname')). Но вы получите визуализированную страницу, а не экземпляр HttpResponse, поэтому вам нужно будет проанализировать ее с помощью некоторой библиотеки для проверки содержимого ответа. – Bruce

0

Таким образом, тест класса django Client не исключает исключения по дизайну, и это хорошо.

Поскольку проблема заключалась в том, чтобы проверить пользовательский обработчик500, который настраивается специальным промежуточным программным обеспечением для определенных параметров, просто заменив переменную request.urlconf на пользовательский модуль urlconf, решение заключалось в том, чтобы использовать RequestFactory для создания запроса и запроса на проверку .urlconf.handler500 вид:

в обычае/client1/urls.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) 

в испытаниях/просмотров/test_error_pages.py

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)) 
Смежные вопросы