hotamul의 개발 이야기

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

Dev./Django

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

hotamul 2022. 7. 3. 23:09

[Django] User Model 커스터마이징 #3 (TDD) 에서 User, UserManager 클래스를 직접 커스터마이징 하여 user model을 생성하는 테스트를 통과하게 했다.

이제는 email normalizing 기능 추가와 email을 전달하지 않았을때 exception이 발생할 수 있도록 해보자.


test 작성

먼저 [Django] User Model 커스터마이징 #2 (TDD)에서 작성했던 test_models.py에 다음과 같은 테스트를 추가해 보자.

def test_new_user_email_normalized(self):
    """Test email is normalized for new users."""
    sample_emails = [
        ['test1@EXAMPLE.com', 'test1@example.com'],
        ['Test2@Example.com', 'Test2@example.com'],
        ['TEST3@EXAMPLE.COM', 'TEST3@example.com'],
        ['test4@example.COM', 'test4@example.com']
    ]
    for email, expected in sample_emails:
        user = get_user_model().objects.create_user(email, 'sample123')
        self.assertEqual(user.email, expected)

위 테스트는 @이전 이메일 이름은 대문자, 소문자를 허용하지만 @ 이후 도메인은 항상 소문자이어야 한다는 것을 의미한다.


normalize_email

UserUserManager를 만들었던 models.py로 돌아와 UserManagercreate_user 메소드만 아래와 같이 변경해준다.

def create_user(self, email, password=None, **extra_fields):
     """Create, save and return a new user."""
    user = self.model(email=self.normalize_email(email), **extra_fields)
    user.set_password(password)
    ...

ValueError : test

위에서 normalize 기능을 추가했던 것처럼 먼저 test_models.py에 아래 테스트 코드를 작성한다.

def test_new_user_without_email_raises_error(self):
    """Test that creating a user without an email raises a ValueError."""
    with self.assertRaises(ValueError):
    get_user_model().objects.create_user('', 'test123')

위 테스트는 create_user email 전달인자에 ''만 전달했을 때 ValueError라는 exception이 발생한다는 테스트 코드이다.

이제 테스트가 통과 할 수 있도록 create_user에 제어문을 추가하자.


ValueError

UserManagercreate_user 메소드를 다음과 같이 수정하자

def create_user(self, email, password=None, **extra_fields):
     """Create, save and return a new user."""
     if not email:
         raise ValueError('User must have an email address.')
    user = self.model(email=self.normalize_email(email), **extra_fields)
    user.set_password(password)
    ...

python manage.py test 명령어로 확인하면 테스트가 모두 통과함을 확인할 수 있다.

Comments