Тестирование загрузки файлов с помощью Flask и Python 3
Я использую Flask с Python 3.3, и я знаю, что поддержка все еще экспериментальная, но я сталкиваюсь с ошибками при попытке проверить загрузку файлов. я использую unittest.TestCase
и на основе примеров Python 2.7, которые я видел в документах, которые я пытаюсь
rv = self.app.post('/add', data=dict(
file=(io.StringIO("this is a test"), 'test.pdf'),
), follow_redirects=True)
и получать
TypeError: 'str' does not support the buffer interface
Я пробовал несколько вариантов вокруг io.StringIO, но не могу найти ничего, что работает. Любая помощь высоко ценится!
Полная трассировка стека
Traceback (most recent call last):
File "archive_tests.py", line 44, in test_add_transcript
), follow_redirects=True)
File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 771, in post
return self.open(*args, **kw)
File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/flask/testing.py", line 108, in open
follow_redirects=follow_redirects)
File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 725, in open
environ = args[0].get_environ()
File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 535, in get_environ
stream_encode_multipart(values, charset=self.charset)
File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 98, in stream_encode_multipart
write_binary(chunk)
File "/srv/transcript_archive/py3env/lib/python3.3/site-packages/werkzeug/test.py", line 59, in write_binary
stream.write(string)
TypeError: 'str' does not support the buffer interface
1 ответ
Решение
В Python 3 вам нужно использовать io.BytesIO()
(с байтовым значением) для имитации загруженного файла:
rv = self.app.post('/add', data=dict(
file=(io.BytesIO(b"this is a test"), 'test.pdf'),
), follow_redirects=True)
Обратите внимание b'...'
строка, определяющая bytes
буквальный.
В тестовых примерах Python 2 StringIO()
объект содержит строку байтов, а не unicode
значение, а в Python 3, io.BytesIO()
это эквивалент.