Ich habe diese Form:Wie kann ich ein Formular mit FileField in Django testen?
# forms.py
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['book_title', 'language', 'author', 'release_year', 'genre', 'ages', 'cover']
Art der Felder: Wo book_title
und author
sind CharField
, language
und genre
zu CharField
sind aber für sie ich Wahl Option haben, release_year
und ages
sind IntegerField
und die letzte cover
sind FileField
.
Auswahloptionen:
# models.py
ENGLISH = 'english'
LANGUAGE_CHOICES = (
(ENGLISH, 'English'),
)
ADVENTURE = 'adventure'
GENRE_CHOICES = (
(ADVENTURE, 'Adventure'),
)
Jetzt: Ich möchte diese Form testen, aber ich weiß nicht, wie cover
testen können, hier ist meine Form zu testen.
# test_forms.py
from .. import forms
from django.core.files import File
class TestBookForm:
def test_form(self):
form = forms.BookForm(data={})
assert form.is_valid() is False, 'Should be invalid if no data is given'
img = File(open('background'))
data = {'book_title': 'Lord Of The Rings',
'language': 'english',
'author': 'J. R. R. Tolkien',
'release_year': 1957,
'genre': 'adventure',
'ages': 16,
'cover': img}
form = forms.BookForm(data=data)
assert form.is_valid() is True
Ich habe versucht: von django.core.files.uploadedfile Import SimpleUploadedFile
img = open('background')
uploaded = SimpleUploadedFile(img.name, img.read())
{'cover': uploaded}
Das ist mein Fehler ist:
E assert False is True
E + where False = <bound method BaseForm.is_valid of <BookForm bound=True, valid=False, fields=(book_title;language;author;release_year;genre;ages;cover)>>()
E + where <bound method BaseForm.is_valid of <BookForm bound=True, valid=False, fields=(book_title;language;author;release_year;genre;ages;cover)>> = <BookForm bound=True, valid=False, fields=(book_title;language;author;release_year;genre;ages;cover)>
.is_valid
HINWEIS: Ich benutze Python 3.5
, Django 1.9.4
und ich starte den Test mit py.test
.
UPDATE: Wenn ich versuche, open('background.jpg')
nicht funktionieren. Fehler:FileNotFoundError: [Errno 2] No such file or directory: 'background.jpg'
ich dieses Problem beheben
UPDATE 2:
Ich versuche mock
from django.core.files import File
import mock
file_mock = mock.MagicMock(spec=File, name='FileMock')
file_mock.name = 'test1.jpg'
{'cover': file_mock}
Ich versuche zu verwenden InMemoryUploadedFile
from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
from PIL import Image
im = Image.new(mode='RGB', size=(200, 200)) # create a new image using PIL
im_io = BytesIO() # a StringIO object for saving image
im.save(im_io, 'JPEG') # save the image to im_io
im_io.seek(0) # seek to the beginning
image = InMemoryUploadedFile(
im_io, None, 'random-name.jpg', 'image/jpeg', None, None
)
{'cover': image}
ich fix verwenden die Pfad zu meinem Bild.
Ich habe versucht, eine gefälschte Datei zu machen, aber nicht funktionieren, nachdem ich eine Datei in mein Paket legte und ich versuchte, 'Cover'-Feld zu setzen. Dies ist meine letzte Option? Meine Datei muss 'jpg',' png' oder 'jpeg' sein. – Sn0pY
Wo haben Sie Ihre background.jpg Datei abgelegt? Es muss an Ort und Stelle sein, wo Sie testen von. Nehmen wir an, wenn Sie Ihren Test vom Hauptordner aus ausführen, muss background.jpg da sein. – sebb
Meine 'test_forms' sind im' tests' Paket und meine 'background.jpg' sind im gleichen Paket. Aber wenn ich 'open ('background.jpg') versuche' es funktioniert nicht ... aber 'open ('background')' funktioniert ... – Sn0pY