hotamul의 개발 이야기

[Django] User Model 커스터마이징 #2 (TDD) 본문

Dev./Django

[Django] User Model 커스터마이징 #2 (TDD)

hotamul 2022. 6. 30. 00:14

[Django] User Model 커스터마이징 #1 에서 기본적인 Design을 했으니 이제 구현해보자.

TDD로 개발하는 것을 연습? 공부 중이기 때문에 먼저 test case를 만들어 보겠다.

Create test_models.py

커스터마이징 할 User model을 사용하고자 할 app 디렉토리에 tests 디렉토리를 생성한다. (반드시 __init__.py를 추가해야 한다. 그렇지 않으면 django가 찾지 못한다, python manage.py test 했을 때 실행되지 않음)

그리고 test_modesl.py 파일을 생성한다. (파일 이름, method이름 모두 prefix로 test_가 있어야 하는지 기억이 잘 나지 않지만 습관처럼 파일이름, method 이름 모두 test_로 시작하게 하겠다)

import get_user_model

먼저 email, password 만을 이용해 user 객체를 생성할 수 있는지 test 하기 위해 코드를 작성해 보겠다. 그러려면 model 객체를 생성할 수 있어야 하는데 쉽게 할 수 있는 방법은 django에서 제공하는 helper function을 이용하는 것이다.

user model 객체 생성 helper function인 get_user_model을 이용하기 위해 아래 function을 import 한다.

from django.contrib.auth import get_user_model

그리고 다음과 같은 email, password 정보로 user model을 만들었을때 email, password를 확인하는 test method를 만들어 보자

email = 'test@example.com'
password = 'testpass123'
user = get_user_model().objects.create_user(
    email=email,
    password=password,
)

self.assertEqual(user.email, email)
self.assertTrue(user.check_password(password))

최종 코드는 다음과 같다.

"""
Tests for models.
"""
from django.test import TestCase
from django.contrib.auth import get_user_model


class ModelTests(TestCase):
    """Test models."""

    def test_create_user_with_email_successful(self):
        """Test creating a user with an email is successful."""
        email = 'test@example.com'
        password = 'testpass123'
        user = get_user_model().objects.create_user(
            email=email,
            password=password,
        )

        self.assertEqual(user.email, email)
        self.assertTrue(user.check_password(password))

 

Check FAILED!

이제 python manage.py test로 test를 실행해보자

Traceback (most recent call last):
  File "/app/core/tests/test_models.py", line 15, in test_create_user_with_email_successful
    user = get_user_model().objects.create_user(
TypeError: create_user() missing 1 required positional argument: 'username'

username이라는 필수인자가 빠졌다는 것을 확인할 수 있다. username은 내가 원하는 user model에서는 필요하지 않지만 기본적으로 필수 인자 (필수 Field) 로 설정 되어 있음을 알 수 있다!!

다음 post에서는 email, password 만으로 객체를 생성할 수 있도록 커스터 마이징 해서 방금 작성한 test가 통과 될 수 있도록 해보자.

Comments