2016-11-06 44 views
2

私は自分のUIからビデオファイルを私のメディアパスにアップロードするAPI(Python 3.5、Django 1.10、DRF 3.4.2)を開発しました。その部分は正常に動作しています。私はこの機能のテストを書こうとしますが、正常に動作させることはできません。この試験ではDjango REST FrameworkのAPIRequestFactoryでファイルのアップロード(テスト)リクエストを生成するには?

#views.py 

import os 
from rest_framework import views, parsers, response 
from django.conf import settings 


class FileUploadView(views.APIView): 
    parser_classes = (parsers.FileUploadParser,) 
    def put(self, request, filename): 
     file = request.data['file'] 
     handle_uploaded_file(file, filename) 
     return response.Response(status=204) 

def handle_uploaded_file(file, filename): 
    dir_name = settings.MEDIA_ROOT + '/scene/' + filename + '/cam1' 
    new_filename = 'orig.mp4' 
    if not os.path.exists(dir_name): 
     os.makedirs(dir_name) 
    file_path = os.path.join(dir_name, new_filename) 
    with open(file_path, 'wb+') as destination: 
     for chunk in file.chunks(): 
      destination.write(chunk) 

#test.py 

import tempfile 
import os 
from django.test import TestCase 
from django.conf import settings 
from django.core.files import File 
from django.core.files.uploadedfile import SimpleUploadedFile 
from rest_framework.test import APIRequestFactory 
from myapp.views import FileUploadView 


class UploadVideoTestCase(TestCase): 
    def setUp(self): 
     settings.MEDIA_ROOT = tempfile.mkdtemp(suffix=None, prefix=None, dir=None) 

    def test_video_uploaded(self): 
     """Video uploaded""" 
     filename = 'vid' 
     file = File(open('media/testfiles/vid.mp4', 'rb')) 
     uploaded_file = SimpleUploadedFile(filename, file.read(), 'video') 
     factory = APIRequestFactory() 
     request = factory.put('file_upload/'+filename, 
      {'file': uploaded_file}, format='multipart') 
     view = FileUploadView.as_view() 
     response = view(request, filename) 
     print(response) 

     dir_name = settings.MEDIA_ROOT + '/scene/' + filename + '/cam1' 
     new_filename = 'orig.mp4' 
     file_path = os.path.join(dir_name, new_filename) 
     self.assertTrue(os.path.exists(file_path)) 

私はいくつかの処理をテストする必要があるので、私は、既存のビデオファイル(「メディア/ TESTFILES/vid.mp4」)を使用し、それをアップロードする必要がありますそれ以来、私はを使ってMEDIA_ROOTをリセットしました。

ファイルがアップロードされていないため、テストは失敗します。私のviews.pydef putでは、私がrequestを印刷すると<rest_framework.request.Request object at 0x10f25f048>が得られ、request.dataを印刷すると、が得られません。しかし私の視点でFileUploadParserを削除してrequest = factory.put('file_upload/' + filename, {'filename': filename}, format="multipart")を使用した場合、私はをrequest.dataに印刷します。

私の結論は、私がAPIRequestFactoryで生成するリクエストが間違っていることです。 FileUploadParserは、そこから未処理ファイルを取得できません。

私の質問Django REST FrameworkのAPIRequestFactoryでファイルアップロード(テスト)リクエストを生成するにはどうすればいいですか?

多くの人がこれに近い質問をしていますが、提案された回答では成功しませんでした。

この問題に関するお手伝いをさせていただきます。

答えて

4

今は問題ありません! APIRequestFactoryからAPIClientに切り替えると、私は自分のテストを走らせることができました。

私の新しいtest.py:

import os 
import tempfile 
from django.conf import settings 
from django.core.files import File 
from django.core.files.uploadedfile import SimpleUploadedFile 
from django.urls import reverse 
from rest_framework.test import APITestCase, APIClient 
from django.contrib.auth.models import User 

class UploadVideoTestCase(APITestCase): 
    def setUp(self): 
     settings.MEDIA_ROOT = tempfile.mkdtemp() 
     User.objects.create_user('michel') 

    def test_video_uploaded(self): 
     """Video uploaded""" 
     filename = 'vid' 
     file = File(open('media/testfiles/vid.mp4', 'rb')) 
     uploaded_file = SimpleUploadedFile(filename, file.read(), 
      content_type='multipart/form-data') 
     client = APIClient() 
     user = User.objects.get(username='michel') 
     client.force_authenticate(user=user) 
     url = reverse('file_upload:upload_view', kwargs={'filename': filename}) 
     client.put(url, {'file': uploaded_file}, format='multipart') 
     dir_name = settings.MEDIA_ROOT + '/scene/' + filename + '/cam1' 
     new_filename = 'orig.mp4' 
     file_path = os.path.join(dir_name, new_filename) 
     self.assertTrue(os.path.exists(file_path)) 
関連する問題