(最終更新月:2021年12月)
✔当記事はこのような方に向けて書かれています
「Pythonコードでrequestオブジェクトを作りたい」
「django-allauthが正しく動作しているかチェックしたい!」
「django-allauthのアダプタをテストするにはどうしたら良いのだろうか」
✔当記事を通じてお伝えすること
- RequestFactoryの使い方
- adapterをテストする方法
- コード実例
前回のチュートリアルではDjangoの認証ライブラリ「django-allauth」にてアダプタをカスタマイズしました。
アダプタをテストするためにrequestオブジェクトを作っていきましょう。
requestオブジェクトの生成
from django.test.client import RequestFactory
request = RequestFactory()
ズバリ、こちらがrequestを生成する方法です
request.userにユーザーオブジェクトを代入し、使用します
request.user = userオブジェクト
アダプタをテストする方法
全体の流れはこちらの通りです
- アダプタのインポート
- アダプタオブジェクトの作成
- リクエストオブジェクトの生成とユーザー情報の格納
- アダプタのテストしたい関数にリクエストを渡す
- 返り値のURLを調べる
わかりにくいので、一つ一つみていきます
アダプタのインポート
from accounts.adapters import MyNippoAdapter as adapter
アダプタオブジェクトの作成
adapter_obj = adapter(ユーザーオブジェクト)
リクエストオブジェクトの生成とユーザー情報の格納
request = RequestFactory()
request.user = ユーザーオブジェクト
アダプタの関数にリクエストを渡す
redirect_url = adapter_obj.get_login_redirect_url(request)
返り値のURLを調べる
self.assertEqual(redirect_url, 正しいリダイレクト先)
コード全体
当日報アプリでは、ユーザークラスをOneToOneFieldで拡張した「Profile」クラスがあります。
「ユーザーは存在するけど、プロフィールが存在しない」という場合のログイン時には、プロフィールの設定ページへリダイレクトするようアダプタをカスタマイズしています。
テストをして正しく動作するかを確認しましょう!
from django.test import TestCase
from django.urls import reverse
from django.test.client import RequestFactory
from django.contrib.auth import get_user_model
from accounts.models import Profile
User = get_user_model()
signup_url = reverse("account_signup")
login_url = reverse("account_login")
#test関数2つ
class AdapterTestCase(TestCase):
#signupページでユーザーを作成し、Eメール確認も済にする
def setUp(self):
self.request = RequestFactory()
self.email = "test@itc.tokyo"
self.password = "somepass"
self.res = self.client.post(signup_url, {"email": self.email,
"password1": self.password,
"password2": self.password})
self.user_obj = User.objects.first()
self.email_obj = self.user_obj.emailaddress_set.first()
self.email_obj.verified = True
self.email_obj.save()
self.user_obj.profile.username = "something_changed"
#プロフィールが変わったユーザーのテスト
def test_login_with_profile_user(self):
from accounts.adapter import MyNippoAdapter as adapter
adapter_obj = adapter(self.user_obj)
self.request.user = self.user_obj
redirect_url = adapter_obj.get_login_redirect_url(self.request)
self.assertEqual(redirect_url, reverse("nippo-list"))
#プロフィールが同一のユーザーのテスト
def test_login_without_profile(self):
res = self.client.post(signup_url, {"email": "test2@itc.tokyo",
"password1": self.password,
"password2": self.password})
user2 = User.objects.last()
email_obj2 = user2.emailaddress_set.first()
email_obj2.verified = True
email_obj2.save()
from accounts.adapter import MyNippoAdapter as adapter
adapter_obj = adapter(user2)
self.request.user = user2
redirect_url = adapter_obj.get_login_redirect_url(self.request)
self.assertEqual(redirect_url, reverse("profile-update", kwargs={"pk": user2.profile.pk}))
まとめ
リクエストオブジェクトを作成するには、以下のとおりです。
request = RequestFactory()
request.user = ユーザーオブジェクト
アダプタをテストする流れはこちら。
- アダプタのインポート
- アダプタオブジェクトの作成
- リクエストオブジェクトの生成とユーザー情報の格納
- アダプタのテストしたい関数にリクエストを渡す
- 返り値のURLを調べる
ぜひご活用ください。
次回のチュートリアルでは、日報モデルクラスに新たなフィールドを追加します。
下書きと公開の機能をもたせるためです。