【Django】RequestFactoryでrequestを生成

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

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

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

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

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

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

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

  • RequestFactoryの使い方
  • adapterをテストする方法
  • コード実例

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

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

筆者プロフィール

筆者プロフィールアイコン

【現職】プロマネ/システムプランニング

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

【元】外資系金融機関の営業

コミュニケーション × ビジネススキル × 文章力 × プログラミングスキルを活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

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

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

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

ChatGPTでLINEボット

【今なら無料】ChatGPTでLINEボットを作りました!

友だち追加

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を調べる

ぜひご活用ください。

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

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

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

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

ITCへ投げ銭をする

タイトルとURLをコピーしました