Python 如何创建映像以对API进行单元测试
我有一个代表女性的简单模型,用户可以查看、编辑和创建:Python 如何创建映像以对API进行单元测试,python,django,rest,unit-testing,Python,Django,Rest,Unit Testing,我有一个代表女性的简单模型,用户可以查看、编辑和创建: class Female(models.Model): firstName = models.CharField(max_length=255) lastName = models.CharField(max_length=255) profileImage = models.ImageField() bio = models.TextField() fantasticBio = models.Te
class Female(models.Model):
firstName = models.CharField(max_length=255)
lastName = models.CharField(max_length=255)
profileImage = models.ImageField()
bio = models.TextField()
fantasticBio = models.TextField()
我正在使用一个由多个部分组成的表单,通过Angular service发送create的数据。这个很好用。处理创建的django视图是:
@api_view(['POST'])
def createFemale(request):
serializedFemale = FemaleSerializer(data=request.data)
if serializedFemale.is_valid():
serializedFemale.save()
return Response(serializedFemale.data)
else:
return Response(serializedFemale.errors, status=status.HTTP_400_BAD_REQUEST)
我的问题是我无法完全单元测试这个视图。我在创建可用于通过测试客户端测试视图的映像时遇到问题。我对图像生成的知识有限,因此可能生成错误的图像,但是当我将其直接写入设置中的数据库时,它似乎被接受为Django ImageField。相关测试代码如下所示:
def createImageFile():
"""
Convinience function to create a test image
"""
image = Image.new('RGBA', size=(50, 50), color=(256, 0, 0))
image_file = BytesIO()
image.save(image_file, 'PNG')
img_str = base64.b64encode(image_file.getvalue())
img_str = str.encode("data:image/png;base64,") + img_str
return ImageFile(img_str)
def test_createFemale(self):
"""
A valid Female created with the API should be in the database
"""
profileImage = SimpleUploadedFile("test.png", createImageFile().file, content_type="image/png")
femaleToCreate = {}
femaleToCreate['firstName'] = "Test"
femaleToCreate['lastName'] = "Female"
femaleToCreate['profileImage'] = profileImage
femaleToCreate['bio'] = "Test bio"
femaleToCreate['fantasticBio'] = "Fantastic test bio"
response = self.client.post(url, femaleToCreate)
self.assertEquals(response.status_code, 200) # Make sure valid request returns success response
def test_images_by_component_id_update(self):
image = PIL.Image.new('RGB', size=(1, 1))
file = tempfile.NamedTemporaryFile(suffix='.jpg')
image.save(file)
with open(file.name, 'rb') as f:
data = {'image': f}
response = self.client.patch(reverse('foo', args=(1, 1)), data=data, format='multipart')
self.assertEqual(200, response.status_code)
我从服务器收到的响应是:
{'profileImage': ['Upload a valid image. The file you uploaded was either not an image or a corrupted image.']}
如何在单元测试中创建API可以接受的映像
请不要建议读取现有图像的文件,我已经考虑过这个选项,并选择不继续,因为我认为这是一个糟糕的做法
谢谢您的帮助。好的,我有如下安排:
def createImageFile():
"""
Convinience function to create a test image
"""
image = Image.new('RGBA', size=(50, 50), color=(256, 0, 0))
image_file = BytesIO()
image.save(image_file, 'PNG')
img_str = base64.b64encode(image_file.getvalue())
img_str = str.encode("data:image/png;base64,") + img_str
return ImageFile(img_str)
def test_createFemale(self):
"""
A valid Female created with the API should be in the database
"""
profileImage = SimpleUploadedFile("test.png", createImageFile().file, content_type="image/png")
femaleToCreate = {}
femaleToCreate['firstName'] = "Test"
femaleToCreate['lastName'] = "Female"
femaleToCreate['profileImage'] = profileImage
femaleToCreate['bio'] = "Test bio"
femaleToCreate['fantasticBio'] = "Fantastic test bio"
response = self.client.post(url, femaleToCreate)
self.assertEquals(response.status_code, 200) # Make sure valid request returns success response
def test_images_by_component_id_update(self):
image = PIL.Image.new('RGB', size=(1, 1))
file = tempfile.NamedTemporaryFile(suffix='.jpg')
image.save(file)
with open(file.name, 'rb') as f:
data = {'image': f}
response = self.client.patch(reverse('foo', args=(1, 1)), data=data, format='multipart')
self.assertEqual(200, response.status_code)
请注意,我必须重新打开该文件,这需要一段时间进行调试。不管出于什么原因,它不喜欢NamedTemporaryFile.file属性,所以我不得不重新打开。为什么要对图像进行Base64编码?@jmbarbier我在浏览器发送图像时看到它是Base64编码的,所以我尝试着看它是否有助于节省我的时间。通过您的示例,我能够为我的端点创建一个测试。