当我的模型中未设置非空字段时,我试图使单元测试失败:
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!")
但它永远不会失败。
当应用程序运行时,电子邮件格式和非空验证工作正常,但我无法编写测试。
当然,我可以通过编程方式进行验证,但我不想重复自己。有什么想法吗?
答案 0 :(得分:2)
好的,你有几个问题,让我列举一下:
save
是多余的。 create
已经完成了保存。创建对象不会触发“此电子邮件是否为有效电子邮件”等内容的验证。如果您尝试传递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上测试。