3
1

More than 3 years have passed since last update.

Flaskのtest_clientでファイルアップロードのテスト

Last updated at Posted at 2021-02-09

Flaskのtest_clientでファイルアップロード機能をテストする際につまづいたので、メモ。

▼やりたかったこと
test_clientを用いて、ファイルアップロードのリクエストを擬似的に発生させる

方法1. タプルを用いてファイルアップロードを再現

test_file.py
from io import BytesIO

res = app.test_client().post('/do_regist_post', data=dict(text='テスト', file=(BytesIO(b'test'), 'test.png')),
                      content_type="multipart/form-data")

・"file"がアップロードファイルが格納される変数
・タプルで(<BytesIO>, ファイル名)を格納することで、<input type=file>フォームからファイルアップロードされたリクエストだと認識してくれるっぽい

方法2. FileStorageオブジェクトを用いてファイルアップロードを再現

test_file.py
from io import BytesIO
from werkzeug.datastructures import FileStorage

res = app.test_client().post('/do_regist_post', data=dict(text='テスト',
                                                   file=FileStorage(filename='test.png', stream=BytesIO(b'test'))),
                      content_type="multipart/form-data")

・"file"がアップロードファイルが格納される変数
・Flaskでは<input type=file>フォームの値はFileStorageオブジェクトで渡されるので、それで再現
・"stream"にファイルの中身が入る(画像ファイルだと、そのバイナリ等)
・"stream"は<BytesIO>しか受け付けないぽいので注意

▼FileStorageクラスの詳細は以下で参照可能
https://werkzeug.palletsprojects.com/en/1.0.x/

以上。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1