首页 > 解决方案 > Django Pytest 图片上传图片单元测试

问题描述

我正在使用 Django 3.2.6、django-pytest 和 factory boy 来运行自动化测试。

这是我用来制作测试图像的功能:

from PIL import Image
from django.core.files.uploadedfile import SimpleUploadedFile


def test_image(name='test.jpg', size=(250,250)):
    img = Image.new('RGB', size)
    content = img.tobytes()

    # return Django file for testing in forms and serializers
    return SimpleUploadedFile(name, content=content, content_type='image/jpeg')

这是正在测试的视图:

class PhotoCreateView(LoginRequiredMixin, CreateView):
    model = Photo
    form_class = PhotoForm
    success_url = '/'
    template_name = 'photos/create.html'

    def form_valid(self, form):
        new_category = form.cleaned_data['new_category']
        if new_category:
            category = Category.objects.create(name=new_category)
            form.instance.category = category
        return super().form_valid(form)

这是测试类:

class TestPhotoCreateView:
    url = reverse('photos:create')

    def test_photo_create_view_authenticated_user_can_access(self, client, user):
        client.force_login(user)
        response = client.get(self.url)
        assert response.status_code == 200
    
    def test_photo_create_view_unauthenticated_user_cannot_access(self, client):
        response = client.get(self.url)
        assert response.status_code == 302

    def test_photo_create_view_form_valid_existing_category(self, client, user):
        client.force_login(user)

        for _ in range(3):
            CategoryFactory()
        
        category = CategoryFactory()
        image = test_image()

        form_data = {
            'category': category.pk, 
            'new_category': '', 
            'description': 'hello world', 
            'image': image,
        }
        response = client.post(self.url, form_data)
        print(response.content)
        photo = Photo.objects.get(description=form_data['description'])
        assert photo.category == form_data['category']

所有的测试都通过了,除了test_photo_create_view_form_valid_existing_category. 我跑了pytest --capture=tee-sys,这个错误出现在图像字段中:

<p id="error_1_id_image" class="invalid-feedback"><strong>Upload a valid image. The file you uploaded was either not an image or a corrupted image.</strong></p>

如何让上传通过测试?

这个项目的所有代码都在这里:https ://github.com/leigh-data/photo_gallery

标签: pythondjangotestingpytest

解决方案


推荐阅读