我想对我的观点进行单元测试。该视图应该从表单中获取图像,将它们上传到Amazon S3,最后显示上传图像的预览。
我想问任何人一个完整的例子:
答案 0 :(得分:6)
可以使用RequestFactory
测试视图。这样你就可以跳过所有减慢测试速度的中间件和网址解析。请注意,您必须修改返回的request
对象,以便装饰视图功能的所有装饰器都可以使用它。
测试时,您可以为测试提供虚拟存储,以便不会命中S3,并提供1x1图像文件,以便PIL
不会尖叫它看起来不像图像文件(文件可以在您的其他测试用例中重用,而不是以编程方式创建)。或者,根据使用的客户端库,在您正在进行实际模拟时模拟选择库的存储对象的save()
或_save()
方法(如果使用{{myapp.models
,则可能storage
1}} ImageField
的kwarg,或使用设置的django内部。)
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 ...
答案 1 :(得分:1)
我不确定您是否可以在上下文中使用它,但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], ...}