I’m building an authentication system for a website, I don’t have prior test experience with Django. I have written some basic tests.
the model,
JavaScript
x
30
30
1
class User(AbstractBaseUser, PermissionsMixin):
2
username = models.CharField(max_length=25, unique=True, error_messages={
3
'unique': 'The username is taken'
4
})
5
first_name = models.CharField(max_length=60, blank=True, null=True)
6
last_name = models.CharField(max_length=60, blank=True, null=True)
7
email = models.EmailField(unique=True, db_index=True, error_messages={
8
'unique': 'This email id is already registered!'
9
})
10
11
is_active = models.BooleanField(default=True)
12
is_staff = models.BooleanField(default=False)
13
14
date_joined = models.DateTimeField(auto_now_add=True)
15
16
USERNAME_FIELD = 'email'
17
REQUIRED_FIELDS = ['username',]
18
19
20
objects = UserManager()
21
22
def get_full_name(self):
23
return ' '.join([self.first_name, self.last_name])
24
25
def get_short_name(self):
26
return self.email
27
28
def __unicode__(self):
29
return self.username
30
and model manager,
JavaScript
1
25
25
1
class UserManager(BaseUserManager):
2
def create_user(self, email, password=None, **kwargs):
3
if not email:
4
raise ValueError('Enter Email address')
5
6
if not kwargs.get('username'):
7
raise ValueError('Enter Username')
8
9
account = self.model(
10
email=self.normalize_email(email), username=kwargs.get('username')
11
)
12
13
account.set_password(password)
14
account.save()
15
16
return account
17
18
def create_superuser(self, email, password, **kwargs):
19
account = self.create_user(email, password, **kwargs)
20
21
account.is_superuser = True
22
account.save()
23
24
return account
25
and my tests,
JavaScript
1
50
50
1
class SettingsTest(TestCase):
2
def test_account_is_configured(self):
3
self.assertTrue('accounts' in INSTALLED_APPS)
4
self.assertTrue('accounts.User' == AUTH_USER_MODEL)
5
6
7
class UserTest(TestCase):
8
def setUp(self):
9
self.username = "testuser"
10
self.email = "testuser@testbase.com"
11
self.first_name = "Test"
12
self.last_name = "User"
13
self.password = "z"
14
15
self.test_user = User.objects.create_user(
16
username=self.username,
17
email=self.email,
18
first_name=self.first_name,
19
last_name=self.last_name
20
)
21
22
23
def tearDown(self):
24
del self.username
25
del self.email
26
del self.first_name
27
del self.last_name
28
del self.password
29
30
def test_create_user(self):
31
self.assertIsInstance(self.test_user, User)
32
33
def test_default_user_is_active(self):
34
self.assertTrue(self.test_user.is_active)
35
36
def test_default_user_is_staff(self):
37
self.assertFalse(self.test_user.is_staff)
38
39
def test_default_user_is_superuser(self):
40
self.assertFalse(self.test_user.is_superuser)
41
42
def test_get_full_name(self):
43
self.assertEqual('Test User', self.test_user.get_full_name())
44
45
def test_get_short_name(self):
46
self.assertEqual(self.email, self.test_user.get_short_name())
47
48
def test_unicode(self):
49
self.assertEqual(self.username, self.test_user.__unicode__())
50
fortunately all the passes, and my question is, are these tests overdone or underdone or normal? What should be tested in a model? is there any procedure missing? anything wrong with this tests?? how do I effectively write tests??
thank you for any insights.
Advertisement
Answer
That’s quite enough. Just a couple of notes:
- No need to delete properties in
tearDown
- You forgot to tests
UserManager
in linesraise ValueError
usingassertRaises
. - You may also test that user created by
create_user
(from UserManager) canauthenticate
(from django.contrib.auth) by given password and email. - Use
coverage
package to detect which lines/classes/packages/statements were missed to test.