微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 模型方法测试

如何解决Django 模型方法测试

我有这样的模型:

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,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')

但是当我检查覆盖率时,它说我必须为此编写测试用例:

enter image description here

在这里缺少什么?

解决方法

@sevdimali - 首先,当您将另一个字段作为姓氏时,将一个字段命名为 name 而不是 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,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)
        

要重构的关键事项-

  1. IMO,型号名称不应为复数
  2. 名字没有意义。明确一点。名字、中间名、姓氏(如果需要)
  3. 考虑空列及其可能产生的后果。您不希望用户连名字、姓氏、电子邮件和其他重要字段都没有。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。