我想对我的视图进行单元测试。该视图应从表单中获取图像,将其上传到Amazon S3,最后显示上传的图像的预览。
我想要一个完整的示例来:
- 编写视图的单元测试。
- 在测试中模拟什么以及如何模拟以保持测试速度较快。
我想对我的视图进行单元测试。该视图应从表单中获取图像,将其上传到Amazon S3,最后显示上传的图像的预览。
我想要一个完整的示例来:
RequestFactory
进行测试。这样您就可以跳过所有中间件和URL解析,从而加快测试速度。请注意,您需要修改返回的request
对象,以便所有装饰器都能正常处理视图函数。PIL
抱怨它看起来不像图像文件(该文件可以在其他测试用例中重复使用,而不是通过编程方式创建)。或者,根据使用的客户端库,在进行实际模拟时,模拟所选库的存储对象的save()
或_save()
方法(如果使用ImageField
的storage
参数,则为myapp.models
,或者如果使用设置,则为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 ...
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], ...}
valid_png_bin = bytes("".join(valid_png_hex), "utf-8")
- Karim N Gorjux
model.objects
和model.save
属性和方法,以避免访问数据库(请注意,某些视图装饰器仍可能使用数据库)。使用SimpleTestCase
可以防止Django为该特定测试用例准备数据库。 - Maciej Gol