5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Django】Formをテストする方法 【TDD】

Last updated at Posted at 2019-12-25

ファイルのアップロードのテストってどうやんだ…

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)

これでバリデーションエラーの内容が見れます。
想定通りのエラーかチェックしてあげてくださいね。

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?