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

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

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

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

ソフトウェアテスト

ソフトウェアテストは、プログラムを実行し、要求通りに正しく動作が行えているかどうか確認する作業です。プログラム中のバグをできる限り多く発見することを目標として行われます。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

2591閲覧

Djangoでテストコードでログイン状態にならない

KentarouHayashi

総合スコア23

Django

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

ソフトウェアテスト

ソフトウェアテストは、プログラムを実行し、要求通りに正しく動作が行えているかどうか確認する作業です。プログラム中のバグをできる限り多く発見することを目標として行われます。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2021/12/05 06:52

前提・実現したいこと

参考書を見つつ日記アプリを作成しております。
TestCaseクラスを使ったテストコードでログイン状態を作りたい

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

テストコードを実行すると以下エラーが表示されます。

AssertionError: '/accounts/login/?next=%2Fdiary-create%2F' != '/diary-list' - /accounts/login/?next=%2Fdiary-create%2F + /diary-list : Response redirected to '/accounts/login/?next=/diary-create/', expected '/diary-list'Expected '/accounts/login/?next=/diary-create/' to equal '/diary-list'.

該当のソースコード

python

1from django.contrib.auth import get_user_model 2from django.test import TestCase 3from django.urls import reverse_lazy 4 5from ..models import Diary 6 7 8class LoggedInTestCase(TestCase): 9 """各テストクラスで共通の事前準備処理をオーバーライドした独自TestCaseクラス""" 10 11 def setUp(self): 12 """テストメソッド実行前の事前設定""" 13 14 # テストユーザーのパスワード 15 #self.password = 'user1234' 16 17 # 各インスタンスメソッドで使うテスト用ユーザーを生成し 18 # インスタンス変数に格納しておく 19 self.test_user = get_user_model().objects.create_user( 20 username='tester', 21 email='tester@codona.com', 22 password='user1234') 23 # テスト用ユーザーでログインする 24 self.client.login(email=self.test_user.email, password=self.test_user.password) 25 26 27class TestDiaryCreateView(LoggedInTestCase): 28 """DiaryCreateView用のテストクラス""" 29 30 def test_create_diary_success(self): 31 """日記作成処理が成功することを検証する""" 32 33 34 # Postパラメータ 35 params = {'title': 'テストタイトル', 36 'content': '本文', 37 'photo1': ''} 38 39 # 新規日記作成処理(Post)を実行 40 response = self.client.post(reverse_lazy('diary:diary_create'), params) 41 42 # 日記リストページへのリダイレクトを検証 43 self.assertRedirects(response, reverse_lazy('diary:diary_list')) 44 45 # 日記データがDBに登録されたかを検証 46 self.assertEqual(Diary.objects.filter(title='テストタイトル').count(), 1)

試したこと

エラーの内容でなぜURLが異なるのかを調べていたところ、該当のURL(/accounts/login/?next=/diary-create/)がログアウト時に遷移するURLであることがわかりました。ログイン時には/diary-listに遷移するはずが遷移しておりませんでした。
ネットを参照してみましたが具体的な情報が得られず、どのようにしたらログイン状態を作れるのかがわかりませんでした。
以下の部分でログインできるはずができていないようなのですが、どのようにしたらログインできるのでしょうか?

# テスト用ユーザーでログインする self.client.login(email=self.test_user.email, password=self.test_user.password)

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

Django:3.2.8
Python:3.9.7
OS:Windows11

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

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

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

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

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

guest

回答1

0

ベストアンサー

整理

手元で挙動を見返した範囲では、コード上の問題点と思われるのは次の2箇所です。

login時に必要なのはユーザー名

現状self.cleint.loginでメールアドレスとパスワードを渡していますが、渡す必要があるのはユーザー名とパスワードです。

passwordに生パスワードを渡せていない

Userオブジェクトが保持しているpasswordではなく、あくまで保存用に不可逆変換したデータです。
self.client.loginには生パスワードを渡す必要があります。

回答となるコード例

diff

1class LoggedInTestCase(TestCase): 2 """各テストクラスで共通の事前準備処理をオーバーライドした独自TestCaseクラス""" 3 4 def setUp(self): 5 """テストメソッド実行前の事前設定""" 6 7 # テストユーザーのパスワード 8 #self.password = 'user1234' 9 10 # 各インスタンスメソッドで使うテスト用ユーザーを生成し 11 # インスタンス変数に格納しておく 12 self.test_user = get_user_model().objects.create_user( 13 username='tester', 14 email='tester@codona.com', 15 password='user1234') 16 # テスト用ユーザーでログインする 17- self.client.login(email=self.test_user.email, password=self.test_user.password) 18+ # ユーザー名と生パスワードを指定する 19+ self.client.login(username=self.test_user.username, password='user1234')

投稿2021/12/05 13:23

編集2021/12/05 16:06
attakei

総合スコア2740

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

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

KentarouHayashi

2021/12/05 22:11 編集

ご回答ありがとうございます。 ご教示いただいた内容で無事にエラーが出なくなりました。 参考書や参考書に付録でついてきたサンプルのファイルではself.cleint.loginでemailを渡していたのでその部分は疑っておりませんでした。 約2日悩んでいたので大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問