2016-09-14 7 views
3

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.

Antwort

1

ich das Problem meinen Code Dies finden passieren:

#test_forms.py 
from .. import forms 
from django.core.files.uploadedfile import SimpleUploadedFile 
import os 

TEST_DIR = os.path.dirname(os.path.abspath(__file__)) 
TEST_DATA_DIR = os.path.join(TEST_DIR, 'data') 


class TestBookForm: 
    def test_form(self): 
     form = forms.BookForm(data={}) 
     assert form.is_valid() is False, 'Should be invalid if no data is given' 

     test_image_path = os.path.join(TEST_DATA_DIR, 'background.jpg') 

     data = {'book_title': 'Lord Of The Rings', 
       'language': 'english', 
       'author': 'J. R. R. Tolkien', 
       'release_year': 1957, 
       'genre': 'adventure', 
       'ages': 16} 

     with open(test_image_path, 'rb') as f: 
      form = forms.BookForm(data=data, files={'cover': SimpleUploadedFile('cover', f.read())}) 
      assert form.is_valid(), 'Invalid form, errors: {}'.format(form.errors) 
0

Entweder Sie erstellen eine Datei in Ihrem Repository, so dass es dort physisch ist, oder Sie verspotten Ihren Test für Ihre Datei.

THIS


EDIT

Try Try

import os 
from django.conf import settings 
file_path = os.path.join(settings.BASE_DIR, your_folder, background.jpg) 
vollständigen Pfad
+0

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

+0

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

+0

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

Verwandte Themen