2013-11-11 2 views
3

У меня странная проблема в тесте шаблона Django. Когда тест выполняет мое представление, представление возвращает объект HttpResponse. Однако, когда я передаю этот объект ответа методу assertCasetains Django TestCase, объект ответа становится строкой. Поскольку эта строка не имеет атрибута 'status_code', как это делает объект ответа, тест терпит неудачу. Вот мой код:Объект HttpResponse становится строкой при передаче в assertContains

template_tests.py

from django.test import TestCase 
from django.test.client import RequestFactory 

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

    def test_user_selects_non_jpeg_photo_file(self): 
     """ 
     User is trying to upload a photo file via a form 
     with an ImageField. However, the file doesn't have 
     a '.jpg' extension so the form's is_valid function, which 
     I've overridden, flags this as an error and returns False. 
     """ 
     with open('photo.png') as test_photo: 
      request = self.factory.post(reverse('upload-photo'), 
             {'upload_photo': '[Upload Photo]', 
             'photo': test_photo}) 
     kwargs = {'template': 'upload_photo.html'} 
     response = upload_photo(request, **kwargs) 
     # pdb.set_trace() 
     self.assertContains(response, 'Error: photo file must be a JPEG file') 

Когда я запускаю этот код в отладчике и делать «типа (ответ)», прежде чем я называю assertContains, я могу видеть, что «ответ» является объектом HttpResponse , Однако, когда assertContains называется, я получаю эту ошибку:

Я установил дополнительный останова в методе assertContains на месте .../Джанго/тест/testcases.py: 638:

self.assertEqual(response.status_code, status_code... 

В этот момент, когда я снова нахожу «type (response)», я вижу, что он стал строковым объектом и не имеет атрибута status_code. Может ли кто-нибудь объяснить, что происходит? Я использовал этот же тестовый шаблон успешно в десятке других тестов шаблонов, и он работал во всех них. Может ли это иметь какое-то отношение к тому, что этот тест включает в себя загрузку файла?

Спасибо.

ответ

0

У меня была аналогичная проблема, и я решил ее, посмотрев на assertContains, это действительно не поможет вам, но кто знает?

void assertContains(SimpleTestCase self, WSGIRequest response, text, count = ..., int status_code = ..., string msg_prefix = ..., bool html = ...) 

утверждает, что ответ указывает на то, что некоторые контент был получен успешно, (то есть, код состояния HTTP, был, как и ожидалось), и что происходит textcount раз в содержании ответа. Если count - Нет, счетчик не имеет значения - утверждение верно , если текст встречается по крайней мере один раз в ответе.

Could it have something to do with the fact that this test involves uploading a file?

Конечно, как я успешно написал мой тест для простого HttpResponse:

response = self.client.get('/administration/', follow=True) 
self.assertContains(response, '<link href="/static/css/bootstrap.min.css" rel="stylesheet">',msg_prefix="The page should use Bootstrap") 

Так что я на самом деле не помогает, но, возможно, это может помочь кому-то немного.

0

У меня была аналогичная проблема с обработкой Json Response.

self.assertEquals(json.loads(response.content),{'abc': True}) 

После исправления проблемы для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^