(最終更新月:2021年12月)
✔当記事はこのような方に向けて書かれています
「Pythonコードでrequestオブジェクトを作りたい」
「django-allauthが正しく動作しているかチェックしたい!」
「django-allauthのアダプタをテストするにはどうしたら良いのだろうか」
✔当記事を通じてお伝えすること
- RequestFactoryの使い方
- adapterをテストする方法
- コード実例
【著者プロフィール】

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。
☆日報アプリ「D-Repo」(デモ版)→こちら
☆便利ツールアプリ「Tool Station」→こちら
前回のチュートリアルでは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を調べる
ぜひご活用ください。
次回のチュートリアルでは、日報モデルクラスに新たなフィールドを追加します。
下書きと公開の機能をもたせるためです。
✔当ブログは以下のような方に向けて書かれています
「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」
✔当ブログ掲載の記事
- Djangoで作る日報アプリ開発
- WebアプリをWeb上に公開する方法
- Webアプリ開発に必要なそのほかの情報

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。