我正在抓取几个网页并将信息存储到django模型中。
我最近发现我考虑过某些字段的max_length
时间不长,所以我不得不增加它。
为了确保我们团队中没有人使用旧版本的模型,也没有生产,我们想用pytest准备一些简单的测试。
让我们考虑下面的模型摘录
class JobOffer(models.Model):
title = models.CharField(max_length=100) # this should be 120
现在,我尝试在存储超过100个字符的字符串时进行测试失败。
@pytest.mark.django_db
def test_joboffer_title_length(self):
lots = 'x'*120
JobOffer.objects.create(title=lots)
当我跑步时,此测试通过。但是,当我在shell中执行相同的命令时,会引发DatabaseError
这种行为可能是什么原因? pytest是否考虑了字段的max_length
?
答案 0 :(得分:0)
答案较晚,但希望对以后的读者有所帮助。 Django documentation引用此:
请注意,当您调用模型的save()方法时,不会自动调用full_clean()。要为自己创建的模型运行单步模型验证时,您需要手动调用它
尝试下一个解决方案
@pytest.mark.django_db
def test_joboffer_title_length(self):
lots = 'x'*120
job_offer = JobOffer(title=lots)
job_offer.full_clean()
这将失败,并显示ValidationError。接下来的代码对于检查超出最大长度时是否引发异常很有用:
@pytest.mark.django_db
def test_joboffer_title_length(self):
lots = 'x'*120
job_offer = JobOffer(title=lots)
with self.assertRaises(ValidationError):
job_offer.full_clean()
答案 1 :(得分:-1)
我认为你需要save()
你正在创建的对象,就像评估约束时那样:
@pytest.mark.django_db
def test_joboffer_title_length(self):
lots = 'x'*120
JobOffer.objects.create(title=lots).save()
现在测试应该失败。