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/
以上。