【问题标题】:Unit test form with ImageField in django在 django 中使用 ImageField 的单元测试表单
【发布时间】:2023-03-05 02:58:01
【问题描述】:

我有 ImageField 的模型。我正在尝试将 unit test 写入我的表单,但它总是会引发错误。谁能告诉我我的错误在哪里?

从错误中我了解到该表单无效。 print str(form.errors) 回复我这个:

<ul class="errorlist"><li>image<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

错误

Traceback (most recent call last):
  File "/home/nurzhan/CA/slider/tests.py", in test_form_valid
    self.assertTrue(form.is_valid())
AssertionError: False is not true

tests.py:

def test_form_valid(self):
        self.image_file = open(
            os.path.join(BASE_DIR, 'static/images/test.jpg'), "rb"
        )
        data = {
            'title': 'TEST',
        }
        image_data = {
            'image': self.file_valid
        }
        form = SlideForm(data=data, files=image_data)
        self.assertTrue(form.is_valid())

print data回复我:

{'image': &lt;open file '/home/nurzhan/CA/static/images/test.jpg', mode 'rb' at 0x7efe24b47b70&gt;}

我也试过用这个:

data = {
    'image': SimpleUploadedFile(
        self.image_file.name,
        self.image_file.read()
    )
}

在这种情况下print data 回复我{'image': &lt;SimpleUploadedFile: test.jpg (text/plain)&gt;}

forms.py

class ArticleForm(forms.ModelForm):
    class Meta:
    model = Article
    fields = ('image',)

def __init__(self, *args, **kwargs):
    super(SlideForm, self).__init__(*args, **kwargs)
    self.fields['image'].widget.attrs = {
        'accept': 'image/png, image/jpeg, image/gif',
        'id': 'image',
    }

models.py:

from django.db.models.signals import pre_save
from django.dispatch import receiver

class Article(models.Model):
    image = models.ImageField(
        upload_to='article/images/%Y/%m/%d/',
        blank=False,
    )


@receiver(pre_save, sender=Article)
def delete_old_article_image(sender, instance, *args, **kwargs):
    if instance.pk:
        article = article.objects.get(pk=instance.pk)
        if instance.image and article.image != instance.image:
            article.image.delete(False)

回答:

当前的单元测试是:

  def test_form_valid(self):
        data = {
            'title': 'TEST',
        }
        files_data = {
            'image': SimpleUploadedFile(
                self.image_file.name,
                self.image_valid.read()
            )
        }
        form = ArticleForm(data=data, files=files_data)
        self.assertTrue(form.is_valid())

【问题讨论】:

    标签: python django python-2.7 unit-testing django-1.11


    【解决方案1】:

    我查阅了 Django 的源代码,发现: https://github.com/django/django/blob/master/django/forms/forms.py#L74-L76

    您可能需要将文件作为files=data 传递。

    祝你好运!

    【讨论】:

    • 我找到了解决方案。我使用SimpleUploadedFile 作为我的图像文件。谢谢你的回答!
    猜你喜欢
    • 2020-04-23
    • 2018-06-13
    • 2017-10-19
    • 2018-05-26
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多