Dans mon application django, j'ai une vue qui accomplit le téléchargement de fichier. L'extrait de base est comme ceci
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Je voudrais tester la vue unitaire.Je prévois de tester le chemin heureux ainsi que le chemin d'échec..ie, le cas où le request.FILES
'fichier' n'a pas de clé, cas où request.FILES['file']
a None
..
Comment configurer les données de publication pour le chemin heureux? Quelqu'un peut-il me le dire?
Réponses:
À partir de la documentation Django sur
Client.post
:la source
integration test
- n'a pas vraiment d'importance tant que vous n'entrez pas dans des bases de code plus complexes, peut-être même avec une équipe de test réelleJ'avais l'habitude de faire la même chose
with open('some_file.txt') as fp:
mais j'avais besoin d'images, de vidéos et d'autres vrais fichiers dans le repo et aussi je testais une partie d'un composant de base de Django qui est bien testé, donc actuellement, c'est ce que je fais:Dans Python 3.5+, vous devez utiliser un
bytes
objet au lieu destr
. Changer"file_content"
pourb"file_content"
Cela fonctionne bien,
SimpleUploadedFile
crée unInMemoryFile
qui se comporte comme un téléchargement normal et vous pouvez choisir le nom, le contenu et le type de contenu.la source
"file_content"
doit s'agir d'un en-tête d'image valide pour que votre code pense que c'est une image valide.Je vous recommande de jeter un œil à Django RequestFactory . C'est le meilleur moyen de simuler les données fournies dans la demande.
Dit cela, j'ai trouvé plusieurs failles dans votre code.
Donc, je vous recommande de refactoriser votre vue pour utiliser une fonction comme:
Et moquez-vous de cela. Vous pouvez utiliser Python Mock .
PS: Vous pouvez également utiliser Django Test Client Mais cela voudrait dire que vous ajoutez autre chose à tester, car ce client utilise des sessions, des middlewares, etc. Rien de tel que les tests unitaires.
la source
profile_picture
qui utilise uneupload_profile_picture
fonction en interne . Si vous souhaitez tester cette vue, simulez simplement la fonction interne et assurez-vous qu'elle est appelée lors de votre test. Voici un exemple simple: gist.github.com/santiagobasulto/6437356Je fais quelque chose comme ça pour ma propre application liée aux événements, mais vous devriez avoir plus que suffisamment de code pour continuer avec votre propre cas d'utilisation
la source
J'ai fait quelque chose comme ça:
La fonction create_image créera une image afin que vous n'ayez pas besoin de donner le chemin statique de l'image.
Remarque: vous pouvez mettre à jour le code selon votre code. Ce code pour Python 3.6.
la source
Dans Django 1.7, il y a un problème avec TestCase qui peut être résolu en utilisant open (filepath, 'rb') mais lorsque nous utilisons le client de test, nous n'avons aucun contrôle dessus. Je pense qu'il est probablement préférable de s'assurer que file.read () renvoie toujours des octets.
source: https://code.djangoproject.com/ticket/23912 , par KevinEtienne
Sans l'option rb, une TypeError est déclenchée:
la source
la source
Comme mentionné dans la documentation officielle de Django :
Plus d'informations: Comment vérifier si le fichier est passé en argument à une fonction?
Lors du test, nous voulons parfois nous assurer que le fichier est passé comme argument à une fonction.
par exemple
Dans les tests, utilisez la simulation de Python comme ceci:
la source
J'espère que cela t'aides.
la source
J'utilise Python == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
J'ai essayé
self.client.post
mais j'ai eu uneResolver404
exception.La suite a fonctionné pour moi:
la source