Formのあるページのテストがしたいんだ!
前のほうの記事でも言ってるんですが、Formのあるページのテストを作りたいです。
でもなぜだかエラーが出て、テストできませんでした。
とりあえずFormのテストをすればいいやと思って落ち着いたのですが、よく考えたらそのあとの処理のテストができないので、何の解決にもなってなかったです。
やっぱりPOSTしてcontextを確認しないといけません。
解決方法と、何で詰まってたのか。
解決方法は以下の通りです。
openで開いてファイルハンドラを入れ込んで、POSTしてあげれば良いというだけでした。
tests.py
from django.test import TestCase, Client
from django.contrib.auth.models import User
class Test_Model_Create(TestCase):
def setUp(self):
# テストユーザー作成
self.user = User.objects.create_user(username='tdd', email='test_account@aaa.bbb', password='test_pass')
self.client=Client()
# ログイン
self.client.login(username='tdd', password="test_pass")
def test_step1(self):
with open('./path/test.csv') as f:
data = {
"nametest" : "test",
"file_data" : f
}
response = self.client.post('/model_create/form/', data)
self.assertIn('file_data', response.context, "contextにfile_dataが含まれていません")
こんな感じでオッケーです。
詰まってた点は、
- ファイルをクローズした後にPOSTをしてた。
- ファイルハンドラじゃなくてファイルを渡してた(
File(open('./path/excel_test.csv'))
)
こんな理由でした。ほかにもClientじゃなくてRequestFactoryを使ったりしてみてましたが、こんな理由だったとは…
複数ファイルのアップロードテスト
ちなみに今回2つファイルをあげなくちゃいけないのですが、こういう時は下のように書けるみたいです。
tests.py
with open('./path/testA.csv') as fa,open('./path/testB.csv') as fb:
data = {
"name" : "test",
"file_dataA" : fa,
"file_dataB" : fb
}
response = self.client.post('/model_create/form/', data)
with文ってめっちゃ簡単ですね。すごいっす。
まとめ
なんでこんなに悩んでたのかほんと不思議です。
ポカミスは減らしていきたいです。