前提
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
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。