5

我想对我的观点进行单元测试。该视图应该从表单中获取图像,将它们上传到 Amazon S3,最后显示上传图像的预览。

我想请任何人提供以下完整示例:

  1. 如何为视图编写单元测试。
  2. 如何以及在测试中模拟什么以保持高测试速度。
4

2 回答 2

7

该视图可以使用RequestFactory. 这样你就可以跳过所有减慢测试速度的中间件和 url 解析。请注意,您必须修改返回的request对象,以便装饰您的视图函数的所有装饰器都可以使用它。

在测试时,您可以为测试提供一个虚拟存储,这样 S3 就不会被击中,并提供一个 1x1 图像文件,这样PIL就不会尖叫它看起来不像图像文件(该文件可以在您的其他测试用例中重用,而不是以编程方式创建)。或者,根据使用的客户端库,在您进行实际模拟时模拟所选库的存储对象的save()或方法(如果使用 的kwarg ,或者如果使用设置,则可能是 django 内部)。_save()myapp.modelsstorageImageField

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

from myapp import views


class MyViewTest(TestCase):
    def setUp(self):
        self.rq = RequestFactory()

    def test_view(self):
        with open('test_data/test_img.png', 'rb') as img:
            req = self.rq.post('my_view_url', {'my_post': 'data', 'test': 1, 'image': img})
            resp = views.my_view(req)
            # ... asserts ...
于 2013-09-07T09:39:23.273 回答
2

我不确定您是否可以在您的上下文中使用它,但SimpleUploadedFile帮助我测试了上传视图,而无需触及数据库或文件系统。

正如您在下面看到的,我在代码中有一个硬编码的图像,用于初始化SimpleUploadedFile对象。这种方式SimpleUploadedFile真的表现得像一个图像,因为它有一个有效的二进制内容和一个有效的文件名。

# hex encoded bytes of a tiny valid png file
valid_png_hex = ['\x89', 'P', 'N', 'G', '\r', '\n', '\x1a', '\n', '\x00',
                 '\x00', '\x00', '\r', 'I', 'H', 'D', 'R', '\x00',
                 '\x00', '\x00', '\x01', '\x00', '\x00', '\x00', '\x01',
                 '\x08', '\x02', '\x00', '\x00', '\x00', '\x90',
                 'w', 'S', '\xde', '\x00', '\x00', '\x00', '\x06', 'b', 'K',
                 'G', 'D', '\x00', '\x00', '\x00', '\x00',
                 '\x00', '\x00', '\xf9', 'C', '\xbb', '\x7f', '\x00', '\x00',
                 '\x00', '\t', 'p', 'H', 'Y', 's', '\x00',
                 '\x00', '\x0e', '\xc3', '\x00', '\x00', '\x0e', '\xc3',
                 '\x01', '\xc7', 'o', '\xa8', 'd', '\x00', '\x00',
                 '\x00', '\x07', 't', 'I', 'M', 'E', '\x07', '\xe0', '\x05',
                 '\r', '\x08', '%', '/', '\xad', '+', 'Z',
                 '\x89', '\x00', '\x00', '\x00', '\x0c', 'I', 'D', 'A', 'T',
                 '\x08', '\xd7', 'c', '\xf8', '\xff', '\xff',
                 '?', '\x00', '\x05', '\xfe', '\x02', '\xfe', '\xdc', '\xcc',
                 'Y', '\xe7', '\x00', '\x00', '\x00', '\x00',
                 'I', 'E', 'N', 'D', '\xae', 'B', '`', '\x82']
valid_png_bin = "".join(valid_png_hex)
png = SimpleUploadedFile("tiny.png", valid_png_bin)
post_data = {u'image': [png], ...}
于 2017-02-28T07:36:15.590 回答