ファイルのアップロードのテストってどうやんだ…
CSRFのせいでPOSTでファイル送信してもエラー返ってくるんじゃが!
と思ってたけど、formのテストすればいいと分かった。
本当はPOSTして帰ってくるコンテキストを確かめるテストしたかったんだけど、わからんかった。
方法はあるのかもしれないので、わかったら追記します。
解決したのでこの記事にまとめています。
Formのテスト
今回は下のようなFormのテストをするとしましょう。
forms.py
from django import forms
class FormTest(forms.Form):
table_name=forms.CharField(max_length=30)
file_data= forms.FileField()
これに対するファイルアップロードのテストは下のように書きます。
tests.py
from django.core.files import File
from ..forms import DocumentForm
class Test_Model_Create(TestCase):
def setUp(self):
self.file_data=File(open('./path/test.csv'))
def test_step1_form(self):
data = {
"table_name":"name_test"
}
files={
"file_data":self.file_data
}
form = DocumentForm(data,files)
self.assertTrue(form.is_valid())
正しいデータを投げればis_valid()
はTrueを返してくれます。
詰まった点と対策
最初に書いたように、CSRFのせいなのか、正しくファイルをPOSTできてませんでした。
そのあと上記のように変えたのですが、なかなか通ってくれませんでした。
結論から言うとカスタムバリデーションが悪さをしていました。
まあ、悪さというより正しく動作していたのですが、テストで記述したデータはそれにあったものではなかったのです。
自分みたいにならないように、皆さんはformのテストをするときはぜひバリデーションエラーを表示するようにしてあげてください。
tests.py
print(form.errors)
これでバリデーションエラーの内容が見れます。
想定通りのエラーかチェックしてあげてくださいね。