田舎社会人のいろいろ学習記

Python、英語、その他いろいろ

【django】ログインした状態のテストを行う方法【Python】

ログインした状態の動作をテストする方法を整理した。

TestCaseクラスのclient.force_loginメソッドを使用することで、ログインした状態でのテストを行うことができる。


from django.contrib.auth import get_user_model
from django.test import TestCase
from pages.models import Items


UserModel = get_user_model()

class ItemsViewTest(TestCase):
    def setUp(self):    #テスト用データの登録
        self.user = UserModel.objects.create(
            username='test_user',
        )

        self.item = Items.objects.create(
            title='test_title',
            user = self.user,
        )

    def test_should_return_contents(self):        
        self.client.force_login(self.user)  #ログイン
        response = self.client.get("")
        self.assertContains(response, self.item.title)
        self.assertContains(response, self.item.user.username)

以下、使用したmodel, view, template


from django.conf import settings
from django.db import models


class Items(models.Model):
    title = models.CharField("title", max_length=30)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    def __str__(self):
        return self.title


from pages.models import Items
from django.shortcuts import render
from django.contrib.auth.decorators import login_required


@login_required
def homePageView(request):
    items = Items.objects.all()
    context = {"items": items}
    return render(request, "top.html", context)

<head>
    <meta charset="utf-8">
    <title>test</title>
</head>
<body>
    {% if user.is_authenticated %}
    {% if items %}
        {% for item in items %}
            {{ item.title }} by {{ item.user.username }}
        {% endfor %}
    {% endif %}
    {% endif %}
</body>
</html>