Django:如何测试无效的对象创建

时间:2018-07-17 20:43:24

标签: django django-models tdd django-testing django-tests

我有一个模型Student,除其他字段外,该模型还包含两个字段。 mob_student用于存储学生的手机号码,mob_parent用于存储其父母的手机号码。

我设计了Student模型,使得只有提供至少一个手机号码时,Student对象才能成功输入数据库。

由于这种验证需要访问多个字段,因此我创建了以下clean()方法。

class Student(AbstractUser):

    def clean(self):

        if not (self.mob_parent or self.mob_student):
            raise ValidationError("Please enter at least one mobile number.")

在Django的管理站点中,它可以完美运行:

  • 当管理员提供至少一个数字时,对象已成功存储;
  • 当管理员不提供任何一个号码时,消息错误将显示在表单顶部。

即使我的模型完全按照我的要求工作,我编写的测试用例似乎还是有缺陷的。

这里有两个测试单位:

test_create_user_with_one_mobile()测试有效条目。

test_create_user_without_mobile_disallowed()测试无效的条目。

class StudentModelTest(TestCase):

def setUp(self):
        Locality.objects.create(name='Valletta')
        School.objects.create(
            name='Foobar Academy',
            locality=Locality.objects.get(id=1),
            type='public',
        )

def test_create_user_with_one_mobile(self):

    myStudent = Student.objects.create(
        email='foobar@gmail.com',
        first_name='Thomas',
        last_name='Johnson',
        school=School.objects.get(id=1),
        mob_parent='99112233',
        locality=Locality.objects.get(id=1),
    )

    self.assertTrue(isinstance(myStudent, Student))

def test_create_user_without_mobile_disallowed(self):

    myStudent = Student.objects.create(
        email='foobar@gmail.com',
        first_name='Thomas',
        last_name='Johnson',
        school=School.objects.get(id=1),
        locality=Locality.objects.get(id=1),
    )

    self.assertFalse(isinstance(myStudent, Student)) # FAILS

在后者中,Student对象似乎已成功实例化,尽管未指定单个手机号码。怎么这样?

0 个答案:

没有答案