Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建映像以对API进行单元测试_Python_Django_Rest_Unit Testing - Fatal编程技术网

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编码的,所以我尝试着看它是否有助于节省我的时间。通过您的示例,我能够为我的端点创建一个测试。