传递给assertContains时,HttpResponse对象变为字符串

时间:2013-11-11 16:51:47

标签: django django-testing django-unittest

我在Django模板测试中遇到了一个奇怪的问题。当测试执行我的视图时,视图返回一个HttpResponse对象。但是,当我将该响应对象传递给Django TestCase assertContains方法时,响应对象变为字符串。由于此字符串没有像响应对象那样的“status_code”属性,因此测试失败。这是我的代码:

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之前执行'type(response)'时,我可以看到'response'是一个HttpResponse对象。但是,当调用assertContains时,我收到此错误:

AttributeError: 'str' object has no attribute 'status_code'

我在assertContains方法的位置设置了一个额外的断点... / django / test / testcases.py:638:

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

此时,当我再次'输入(响应)'时,我发现它已成为一个字符串对象,并且没有status_code属性。谁能解释一下发生了什么?我已经在十几个其他模板测试中成功使用了相同的测试模式,并且它在所有模板测试中都有效。它可能与此测试涉及上传文件的事实有关吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题并通过查看assertContains解决了它,它并没有真正帮助你,但谁知道呢?

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

断言响应表明已检索到某些内容 成功,(即HTTP状态代码符合预期),以及 text在响应内容中出现count次。 如果count为None,则计数无关紧要 - 断言为真 如果文本在响应中至少出现一次。

  

这可能与此测试涉及上传文件的事实有关吗?

当然,我成功编写了一个简单的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")

所以我并没有真正帮助,但也许这可以帮助一些人。

答案 1 :(得分:0)

我在处理Json Response方面遇到了类似的问题。

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

以下为我解决了问题。