サイトアイコン ITC Media

【Django】RequestFactoryでrequestを生成

requetsの生成とアダプタテスト

(最終更新月:2021年12月)

✔当記事はこのような方に向けて書かれています

「Pythonコードでrequestオブジェクトを作りたい」

「django-allauthが正しく動作しているかチェックしたい!」

「django-allauthのアダプタをテストするにはどうしたら良いのだろうか」

✔当記事を通じてお伝えすること

前回のチュートリアルではDjangoの認証ライブラリ「django-allauth」にてアダプタをカスタマイズしました。

アダプタをテストするためにrequestオブジェクトを作っていきましょう。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

requestオブジェクトの生成

from django.test.client import RequestFactory

request = RequestFactory()

ズバリ、こちらがrequestを生成する方法です

request.userにユーザーオブジェクトを代入し、使用します

request.user = userオブジェクト

アダプタをテストする方法

全体の流れはこちらの通りです

  1. アダプタのインポート
  2. アダプタオブジェクトの作成
  3. リクエストオブジェクトの生成とユーザー情報の格納
  4. アダプタのテストしたい関数にリクエストを渡す
  5. 返り値の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 = ユーザーオブジェクト

アダプタをテストする流れはこちら。

  1. アダプタのインポート
  2. アダプタオブジェクトの作成
  3. リクエストオブジェクトの生成とユーザー情報の格納
  4. アダプタのテストしたい関数にリクエストを渡す
  5. 返り値のURLを調べる

ぜひご活用ください。

次回のチュートリアルでは、日報モデルクラスに新たなフィールドを追加します。

下書きと公開の機能をもたせるためです。

モバイルバージョンを終了