LoginSignup
0
4

More than 3 years have passed since last update.

【Django】 POSTでファイルを送信して返ってくるcontextを確認するテスト 【TDD】

Last updated at Posted at 2019-12-26

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文ってめっちゃ簡単ですね。すごいっす。

まとめ

なんでこんなに悩んでたのかほんと不思議です。
ポカミスは減らしていきたいです。

0
4
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
0
4