Как загрузить текстовый файл в тесте колб? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь написать тест для формы загрузки файлов.Форма является частью приложения Flask.Я использую нос 2 для запуска тестов.

Форма загружает файл JSON.Сервер должен проанализировать этот файл и поместить его в базу данных.Когда я проверяю его с помощью браузера вручную, все работает нормально.

Соответствующая часть представления выглядит следующим образом:

def upload():
    form = UploadForm()
    if request.method == 'POST':
        if form.validate_on_submit():
            # error happens at this line
            exercise_graph = json.load(request.files['graph'])
            # ...

    return render_template('exercises/upload.html', form=form)

И соответствующая функция в тесте выглядит следующим образом:

    def upload_exercise(self, name, description):
        filename = name + ".json"
        data={
            'name' : name,
            'description' : description,
            'graph': (BytesIO(b"{}"), filename)
            }

        class TestingRequest(Request):
            """A testing request to use that will return a
            TestingFileStorage to test the uploading."""
            @property
            def files(self):
                d = MultiDict()
                d['graph'] = TestingFileStorage(filename=filename)
                return d

        app.request_class = TestingRequest

        return self.app.post('/exercises/upload',
            content_type='multipart/form-data',
            data=data,
            follow_redirects=True)

Я использовал это код в качестве отправной точки для функции тестирования.Мне пришлось изменить StringIO на BytesIO, иначе werkzeug будет жаловаться, что ожидает объект байтов.Та же самая процедура тестирования работает нормально для другой формы, которая загружает двоичные файлы.

Когда я запускаю тест, я получаю следующую ошибку:

======================================================================
ERROR: test_exercise_upload_post (tests.test_exercises.ExercisesTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../test_exercises.py", line 130, in test_exercise_upload_post
    response = self.upload_exercise('PushUps', 'Push up your body with your arms')
  File ".../test_exercises.py", line 90, in upload_exercise
    follow_redirects=True)
  File ".../python3.6/site-packages/werkzeug/test.py", line 840, in post
    return self.open(*args, **kw)
  File ".../python3.6/site-packages/flask/testing.py", line 200, in open
    follow_redirects=follow_redirects
  File ".../python3.6/site-packages/werkzeug/test.py", line 803, in open
    response = self.run_wsgi_app(environ, buffered=buffered)
  File ".../python3.6/site-packages/werkzeug/test.py", line 716, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File ".../python3.6/site-packages/werkzeug/test.py", line 923, in run_wsgi_app
    app_rv = app(environ, start_response)
  File ".../python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File ".../python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File ".../python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File ".../python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File ".../python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File ".../python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File ".../python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File ".../python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File ".../python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File ".../python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File ".../python3.6/site-packages/flask_login/utils.py", line 261, in decorated_view
    return func(*args, **kwargs)
  File ".../exercises/views.py", line 54, in upload
    exercise_graph = json.load(request.files['graph'])
  File ".../python3.6/json/__init__.py", line 299, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File ".../python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File ".../python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File ".../python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

----------------------------------------------------------------------

Кажется, что объект TestingFileStorage может быть пустым?Я не уверен, понимаю ли я, как механизм действительно работает.Как данные, которые я указываю в своем объекте BytesIO, передаются в TestingFileStorage?

Есть ли другой способ, который я мог бы попробовать?

Любая помощь будет высоко ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...