Django Model方法测试
Django Model method test
我有这样的模型:
class Users(models.Model):
pin = models.CharField(max_length=16, unique=True)
name = models.CharField(max_length=64)
surname = models.CharField(max_length=64, blank=True, null=True)
patronymic = models.CharField(max_length=64, blank=True, null=True)
def get_full_name(self):
name = self.name
surname = self.surname
if self.surname is None:
surname = ''
if self.name is None:
name = ''
return str(name) + ' ' + str(surname)
我想为 get_full_name 方法编写一个测试用例。
目前我写了这样的东西:
class TestUsersModel(TestCase):
def setUp(self):
self.data1 = Users.objects.create(name='Bob', pin='1')
self.data2 = Users.objects.create(surname='Alex', pin='2')
def test_users_model_entry(self):
data = self.data1
self.assertTrue(isinstance(data, Users))
def test_users_full_name_only_name(self):
data = self.data1.get_full_name()
self.assertEquals(data,'Bob ')
def test_users_full_name_only_surname(self):
data = self.data2.get_full_name()
self.assertEquals(data,' Alex')
但是当我检查覆盖率时,它说我必须为此编写测试用例:
我在这里缺少什么?
@sevdimali - 首先,当您将另一个字段命名为姓氏时,将字段命名为名称而不是 first_name 是个坏主意。此外,如果您决定使用 first_name,那么另一个字段应该是 last_name。一致性很重要。
class Users(models.Model):
pin = models.CharField(max_length=16, unique=True)
name = models.CharField(max_length=64,null=True)#or else you cannot test #object creation without name
surname = models.CharField(max_length=64, blank=True, null=True)
patronymic = models.CharField(max_length=64, blank=True, null=True)
Now, to test your get_full_name(). How about we do something like this?
def setUp(self):
self.user = Users.objects.create(name='test', surname='world',pin='1234')
self.user_without_surname = Users.objects.create(name='test',pin='12345')
self.user_without_name=Users.objects.create(surname='world',pin='123456')
def test_get_full_name_with_valid_name_and_surname(self):
expected = str(self.user.name) + ' ' + str(self.user.surname)
actual = 'test world'
self.assertEquals(expected,actual)
def test_get_full_name_with_empty_surname(self):
expected = str(self.user.name) + ' ' +''
actual = 'test '
self.assertEquals(expected,actual)
def test_get_full_name_with_empty_name(self):
expected = '' + ' ' +str(self.user.surname)
actual = ' world'
self.assertEquals(expected,actual)
重构的关键点-
- IMO,模型名称不能是复数
- 名称没有意义。要明确。 first_name,middle_name,last_name 如果需要
- 考虑空列及其可能产生的后果。您不希望用户没有 first_name、last_name、电子邮件和其他基本字段。
我有这样的模型:
class Users(models.Model):
pin = models.CharField(max_length=16, unique=True)
name = models.CharField(max_length=64)
surname = models.CharField(max_length=64, blank=True, null=True)
patronymic = models.CharField(max_length=64, blank=True, null=True)
def get_full_name(self):
name = self.name
surname = self.surname
if self.surname is None:
surname = ''
if self.name is None:
name = ''
return str(name) + ' ' + str(surname)
我想为 get_full_name 方法编写一个测试用例。 目前我写了这样的东西:
class TestUsersModel(TestCase):
def setUp(self):
self.data1 = Users.objects.create(name='Bob', pin='1')
self.data2 = Users.objects.create(surname='Alex', pin='2')
def test_users_model_entry(self):
data = self.data1
self.assertTrue(isinstance(data, Users))
def test_users_full_name_only_name(self):
data = self.data1.get_full_name()
self.assertEquals(data,'Bob ')
def test_users_full_name_only_surname(self):
data = self.data2.get_full_name()
self.assertEquals(data,' Alex')
但是当我检查覆盖率时,它说我必须为此编写测试用例:
我在这里缺少什么?
@sevdimali - 首先,当您将另一个字段命名为姓氏时,将字段命名为名称而不是 first_name 是个坏主意。此外,如果您决定使用 first_name,那么另一个字段应该是 last_name。一致性很重要。
class Users(models.Model):
pin = models.CharField(max_length=16, unique=True)
name = models.CharField(max_length=64,null=True)#or else you cannot test #object creation without name
surname = models.CharField(max_length=64, blank=True, null=True)
patronymic = models.CharField(max_length=64, blank=True, null=True)
Now, to test your get_full_name(). How about we do something like this?
def setUp(self):
self.user = Users.objects.create(name='test', surname='world',pin='1234')
self.user_without_surname = Users.objects.create(name='test',pin='12345')
self.user_without_name=Users.objects.create(surname='world',pin='123456')
def test_get_full_name_with_valid_name_and_surname(self):
expected = str(self.user.name) + ' ' + str(self.user.surname)
actual = 'test world'
self.assertEquals(expected,actual)
def test_get_full_name_with_empty_surname(self):
expected = str(self.user.name) + ' ' +''
actual = 'test '
self.assertEquals(expected,actual)
def test_get_full_name_with_empty_name(self):
expected = '' + ' ' +str(self.user.surname)
actual = ' world'
self.assertEquals(expected,actual)
重构的关键点-
- IMO,模型名称不能是复数
- 名称没有意义。要明确。 first_name,middle_name,last_name 如果需要
- 考虑空列及其可能产生的后果。您不希望用户没有 first_name、last_name、电子邮件和其他基本字段。