Как протестировать файловое поле в Django Rest Framework

У меня есть этот сериализатор, который я пытаюсь проверить:

class AttachmentSerializer(CustomModelSerializer):
    order = serializers.PrimaryKeyRelatedField()
    file = FileField()

    class Meta:
        model = Attachment
        fields = (
            'id',
            'order',
            'name',
            'file_type',
            'file',
            'created_at',
        )

Мой тест просто проверяет, является ли он допустимым или нет:

    def test_serializer_create(self):
        self.data = {
            'order': self.order.pk,
            'name': 'sample_name',
            'file_type': 'image',
            'created_at': datetime.now(),
            'file': open(self.image_path, 'rb').read()
        }

        serializer = AttachmentSerializer(data=self.data)

        self.assertTrue(serializer.is_valid())

И я постоянно получаю эту ошибку:

{'file': ['No file was submitted. Check the encoding type on the form.']}

Я пытался создать файл различными способами, такими как StringIO/BytesIO, File и т.д. безрезультатно.

Что может быть не так?

2 ответа

  1. Дело в том, что вы передаете открытый файл APIClient / APIRequestFactory, а не самому представлению. Запрос Django будет обертывает файлUploadedFile, который является то, что вы должны использовать.

  2. from django.core.files.uploadedfile import SimpleUploadedFile
    content = SimpleUploadedFile("file.txt", "filecontentstring")
    data = {'content': content}
    

    попробуйте smth так, потому что если вы проверяете код сериализатора FileField-он ожидает UploadedFile, который должен иметь имя и размер:

        def to_internal_value(self, data):
        try:
            # `UploadedFile` objects should have name and size attributes.
            file_name = data.name
            file_size = data.size
        except AttributeError:
            self.fail('invalid')
    

    и StringIO или открытые файловые объекты не имеют атрибута size.