質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

391閲覧

djangoのユニットテストでオブジェクト更新処理が成功しない

deango

総合スコア161

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/29 06:50

編集2022/10/12 13:43

前提

djangoで日記アプリを作成しています。
ユニットテストを実施しており、日記の編集処理をテストしているのですが、
日記編集処理(Post)を実行後しても、編集がかからず困っています。

実際に手で動かしたときは編集できています。

また、日記の作成処理と編集処理は同じフォームを使いまわしていますが、
編集処理のみエラーが出ている状態です。

お力添えいただけますと幸いです。

発生している問題・エラーメッセージ

====================================================================== FAIL: test_update_diary_success (diary.tests.test_views.TestDiaryUpdateView) 日記編集処理が成功することを検証する ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/src/app/nyapu/diary/tests/test_views.py", line 131, in test_update_diary_success self.assertEqual(Diary.objects.filter(title='タイトル編集後').count(), 1) AssertionError: 0 != 1 ----------------------------------------------------------------------

該当のソースコード

test_views.py

1class TestDiaryUpdateView(LoggedInTestCase): 2 """DiaryUpdateView用のテストクラス""" 3 4 def test_update_diary_success(self): 5 """日記編集処理が成功することを検証する""" 6 7 # テスト用の画像ファイル 8 img = self._make_dummy_image() 9 10 # テスト用日記データの作成 11 diary = Diary.objects.create( 12 user=self.test_user, 13 title='タイトル編集前', 14 content='本文', 15 lat= 35.709, 16 lon= 139.7319 17 ) 18 19 # 日記データがDBに登録されたかを検証 20 self.assertEqual(Diary.objects.filter(title='タイトル編集前').count(), 1) 21 22 # Postパラメータ 23 params = {'title': 'タイトル編集後'} 24 25 # 日記編集処理(Post)を実行 26 response = self.client.post(reverse_lazy('diary:diary_update', kwargs={'pk': diary.pk}), params) 27 28 # 日記詳細ページへのリダイレクトを検証 29 #self.assertRedirects(response, reverse_lazy('diary:diary_detail', kwargs={'pk': diary.pk})) 30 self.assertEqual(response.status_code, 200) 31 32 # 日記データが編集されたかを検証 33 self.assertEqual(Diary.objects.filter(title='タイトル編集後').count(), 1) 34

models.py

1class Diary(models.Model): 2 '''日記モデル''' 3 user = models.ForeignKey('accounts.CustomUser', verbose_name='ユーザー', related_name='user', on_delete=models.PROTECT) 4 title = models.CharField(verbose_name='タイトル', max_length=2200, blank=True, null=True) 5 content = models.TextField(verbose_name='本文', max_length=2200, blank=True, null=True) 6 photo1 = models.ImageField(verbose_name='写真1', blank=True, null=True) 7 photo2 = models.ImageField(verbose_name='写真2', blank=True, null=True) 8 photo3 = models.ImageField(verbose_name='写真3', blank=True, null=True) 9 created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True) 10 updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True) 11 lat = models.DecimalField(verbose_name="緯度", max_digits=9, decimal_places=6, default=35.709) 12 lon = models.DecimalField(verbose_name="経度", max_digits=9, decimal_places=6, default=139.7319)

views.py

1class DiaryCreateView(LoginRequiredMixin, generic.CreateView): 2 model = Diary 3 template_name = 'diary_create.html' 4 form_class = DiaryCreateForm 5 6 def get_success_url(self): 7 return reverse_lazy('diary:diary_list', kwargs={'username': self.request.user}) 8 9 def form_valid(self, form): 10 diary = form.save(commit=False) 11 diary.user = self.request.user 12 diary.save() 13 messages.success(self.request, '日記を作成しました。') 14 return super().form_valid(form) 15 16 def form_invalid(self, form): 17 messages.error(self.request, "日記の作成に失敗しました。") 18 return super().form_invalid(form) 19 20class DiaryUpdateView(LoginRequiredMixin, generic.UpdateView): 21 model = Diary 22 template_name = 'diary_update.html' 23 form_class = DiaryCreateForm 24 25 def get_success_url(self): 26 return reverse_lazy('diary:diary_detail', kwargs={'pk': self.kwargs['pk']}) 27 28 def form_valid(self, form): 29 messages.success(self.request, '日記を更新しました。') 30 return super().form_valid(form) 31 32 def form_invalid(self, form): 33 messages.error(self.request, "日記の更新に失敗しました。") 34 return super().form_invalid(form)

forms.py

1class DiaryCreateForm(forms.ModelForm): 2 class Meta: 3 model = Diary 4 fields = ('title', 'content', 'photo1', 'photo2', 'photo3', 'lat', 'lon') 5 6 error_messages = { 7 'photo1': { 8 'required': "画像を添付してください。", 9 }, 10 }

試したこと

以下のコードですが、もともとはassertRedirectsにしていました。
(修正前)
# 日記詳細ページへのリダイレクトを検証
self.assertRedirects(response, reverse_lazy('diary:diary_detail', kwargs={'pk': diary.pk}))
(修正後)
# 日記詳細ページへのリダイレクトの検証
self.assertEqual(response.status_code, 200)

assertRedirectsの場合、以下のエラーになったため、上記のステータスコード200のassertEqualに変更しました。

assertRedirectsの時のエラー

1FAIL: test_update_diary_success (diary.tests.test_views.TestDiaryUpdateView) 2日記編集処理が成功することを検証する 3---------------------------------------------------------------------- 4Traceback (most recent call last): 5 File "/usr/src/app/nyapu/diary/tests/test_views.py", line 126, in test_update_diary_success 6 self.assertRedirects(response, reverse_lazy('diary:diary_detail', kwargs={'pk': diary.pk})) 7 File "/usr/local/lib/python3.7/site-packages/django/test/testcases.py", line 360, in assertRedirects 8 % (response.status_code, status_code) 9AssertionError: 200 != 302 : Response didn't redirect as expected: Response code was 200 (expected 302)

補足情報(FW/ツールのバージョンなど)

Python 3.10.6
Django 4.0.2

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

latとlonのフィールドが必須パラメータですが、
testコードの編集処理のパラメータに記載していなかったため、
日記の編集に失敗していました。

以下の通り修正して、更新できました。
params = {'title': 'タイトル編集後'}

params = {'title': 'タイトル編集後',
'lat': 35.709,
'lon': 139.7319
}

投稿2022/10/12 13:47

deango

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問