【Django】requestを生成して、allauthのadapterをテストする

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

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

Djangoの認証ライブラリ「django-allauth」にてアダプタをカスタマイズしました

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

「アダプタをテストするってどうやるの?」

という方へ向けて、実際のコードと共に解説していきます

当記事を通じて、

  • テストプログラムでrequestを生成する方法
  • adapterをテストする方法
  • 実際のコード

について紹介、解説していきます

アダプタのテストには、「request」を引数で渡す必要があります

まずは「request」の生成方法からご紹介します

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")

class UserTestCase(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()
        profile_obj = Profile(user=self.user_obj, username="test user")
        profile_obj.save()
        self.profile_obj = profile_obj

    #プロフィールを持っているユーザーのログインテスト
    def test_login_with_profile_user(self):
        from accounts.adapters 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.adapters 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-create"))

まとめ

リクエストオブジェクトを作成するには、

request = RequestFactory()
request.user = ユーザーオブジェクト

アダプタをテストするには、

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

という流れになります

皆さんのお悩みの解決となれば幸いです!

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

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

という方は必見です!

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

公式LINEも始めました。ブログの更新や最新の業界情報などを随時配信します!

友だち追加

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