使用pytest测试django模型字段的max_length

时间:2015-01-23 12:42:03

标签: django database pytest

我正在抓取几个网页并将信息存储到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

2 个答案:

答案 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()

现在测试应该失败。