2

単体テストを持つフォームがあるとします。フォームはファイル形式を検証します。

class QForm(forms.ModelForm):
    error_messages = {
    'title_too_short': 'Title is too short',
    'invalid_image_format': 'Invalid image format: Only jpg, gif and png are allowed',
    }

    VALID_IMAGE_FORMATS = ('jpg', 'gif', 'png')

    title  = forms.CharField(label="Title")

    pic = forms.CharField(label="Picture")

    class Meta:
        model = Q
        fields = ("title", )

    def clean_title(self):
        title = self.cleaned_data["title"]
        if len(title) < 11:
           raise forms.ValidationError(self.error_messages['title_too_short'])
        return title

    def clean_pic(self):
        pic = self.cleaned_data["pic"]
        if pic:
            from django.core.files.images import get_image_dimensions
            if not pic.content_type in VALID_IMAGE_FORMATS:
                raise forms.ValidationError(self.error_messages['invalid_image_format'])

        return pic

単体テストを作成しようとしましたが、常に次のエラーが返されます。

AttributeError: 'unicode' object has no attribute 'content_type'

そして、私の単体テストは次のようになります。

class FormTests(TestCase):
    def test_add(self):
        upload_file = open(os.path.join(settings.PROJECT_ROOT, 'static/img/pier.jpg'), "rb")
        data = {
            'title': 'Test', 
            'pic': SimpleUploadedFile(upload_file.name, upload_file.read())
        }

        q = QForm(data)

        self.assertEqual(q.is_valid(), True)

ファイルをアップロードするのに間違った方法を使用しているのだろうか?

ありがとう。

4

1 に答える 1

3

フォームでファイルを処理している場合はfiles、コンストラクターに渡す別の値が必要です。Django ドキュメントのこちらを参照してください。

https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded-files-to-a-form

class FormTests(TestCase):
    def test_add(self):
        upload_file = open(os.path.join(settings.PROJECT_ROOT, 'static/img/pier.jpg'), "rb")
        data = {
            'title': 'Test', 
        }
        file_data = {
            'pic': upload_file
        }

        q = QForm(data, file_data)

        self.assertEqual(q.is_valid(), True)
于 2013-02-19T10:20:16.610 に答える