Django:如何测试非空字段

时间:2015-07-06 00:07:04

标签: python django django-models

当我的模型中未设置非空字段时,我试图使单元测试失败:

class Foo(models.Model):
    email = models.EmailField(
        unique=True,
        null=False,
        blank=False)

def testFoo(self):
    try:
        Foo.objects.create().save()
    except:
        self.fail("error!")

但它永远不会失败。

当应用程序运行时,电子邮件格式和非空验证工作正常,但我无法编写测试。

当然,我可以通过编程方式进行验证,但我不想重复自己。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

好的,你有几个问题,让我列举一下:

  1. save是多余的。 create已经完成了保存。
  2. 创建对象不会触发“此电子邮件是否为有效电子邮件”等内容的验证。如果您尝试传递email=None,则会因为您的null=False字段参数而失败,但电子邮件的默认值为'',因此该级别的失败不会失败。如果要验证电子邮件是否有效,请执行以下操作:

    def testFoo(self):
        try:
            a = Foo.objects.create()
            a.clean_fields()
        except:
            self.fail("error!")
    

答案 1 :(得分:-1)

force_insert参数在别处记录,但它的全部意思是始终会创建一个新对象。通常你不需要担心这个。但是,如果您的模型包含您设置的手动主键值,并且该值已存在于数据库中,则对create()的调用将因IntegrityError而失败,因为主键必须是唯一的。如果您使用手动主键,请准备好处理异常。

https://docs.djangoproject.com/en/1.8/ref/models/querysets/

不要使用create方法。同样希望函数testFoo是TestCase的一种方法。

我在过去测试过sqlite3,尝试在postgres或mysql上测试。