4

Python 3.4 で Django 1.7 を使用して単体テストを作成しています。file_data以下のフォームは、要素がコメント アウトされている場合に正常に検証されます。含まれていると、file_data検証されず、テストは失敗します。

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

data = {
    'phone_number': '123456',
    'job': Job.objects.latest('id').pk,
}
file_data = {
    'portrait': SimpleUploadedFile(
        content=b'',
        content_type='image/jpeg',
        name='test.jpg',
    )
}
form = PersonForm(data, file_data)
self.assertTrue(form.is_valid())

同様のコードFileFieldは、私のサイトの他の場所にあるアップロード テストでも問題なく機能します。シェルでコードを実行すると、次のようになりform.errorsます。'Upload a valid image. The file you uploaded was either not an image or a corrupted image.'したがって、問題はcontentまたはcontent_typeフィールドのいずれかにあると思います。この回答のように、文字列としての画像を使用してみましたが、役に立ちませんでした。[編集: 文字列としてのイメージのアプローチは実際には答えでしたが、実装がうまくいかなかったに違いありません。受け入れられた回答は機能することが確認されています。] SimpleUloadedFile ソース コードに手がかりが見つかりませんでした。

フォームは実際には問題なく動作しますが、将来のメンテナンスのために動作テストで確実にカバーしたいと考えています。理想的には、test.jpgイメージがファイルに含まれているため、実際のファイルが存在する.gitignore必要はなく、現在非常にスムーズに自動化されている展開をハッキングし始める必要はありません。

SimpleUploadedFile正しく検証するには、どのような入力を行う必要がありますか?

4

1 に答える 1

5

Imageテスト スーツと作業コードの間で libを実行することに違いはありますか? Imagelib は GIF などのファイルを適切に処理できますか? PIL/pillowインストールも確認する必要があるかもしれません。

SimpleUploadedFile(name='foo.gif', 
                   content=b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00')

私のために働きます。

フォームは、次のような方法で、forms.ImageFieldその 内のテスト イメージに内部的に依存しています。to_python()

import io
from django.utils.image import Image
Image.open(io.BytesIO(image_content)).verify()

この行に例外があるverify()と、エラーが発生します'Upload a valid image...'。に割り当てることで、画像のバイトを確認できますimage_content

image_content = b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00'

私にとってもうまくいきます。

また、画像バイトをオンラインで生成することもできます。

import io    
from django.utils.image import Image
fp = io.BytesIO()
Image.new('P', (1,1)).save(fp, 'png')
fp.seek(0)
portrait = SimpleUploadedFile(name=''foo, content=fp.read())
于 2014-10-01T14:02:01.460 に答える