【问题标题】:Django tests not validating null=False constraintDjango 测试不验证 null=False 约束
【发布时间】:2018-06-22 12:58:14
【问题描述】:

我有一个不同领域的模型。其中之一是 CharField

field = models.CharField(max_length=100, blank=False, null=False)

现在,当我在 django 测试类函数“setUpTestData”中创建一个没有此字段的对象时,它不会给出任何错误。 如果我将 minLengthValidator 添加到它,那么它也不会给任何

models.CharField(blank=False, null=False, max_length=100, validators=[MinLengthValidator(1)])

当我在创建对象后打印它时,它会给出一个空字符串。

我还有另一个字段:

field2 = models.DateTimeField(blank=False, null=False)

现在如果我在创建对象时不提供这些数据,测试会正确失败。

class Bag(models.Model):
    created_on = models.DateTimeField(default=timezone.now)
    order_id = models.CharField(blank=False, null=False, max_length=100)
    order_created_time = models.DateTimeField(blank=False, null=False)


class SalesBagTestCase(TestCase):

    @classmethod
    def setUpTestData(cls):
        Bag.objects.create(order_created_time=datetime.now())

    def test_bag(self):
        bag_response = self.client.get('http://localhost:8000/bag/')
        self.assertEqual(bag_response.status_code, 200)

即使我删除了 setUpData 方法中的 order_id 字段,AssertEqual 也是 True

【问题讨论】:

  • 你能发布你的测试代码吗?
  • 没有看到您的测试代码很难说,但请注意 Django 级别的验证不会自动发生(请参阅full_clean())。不过,数据库级别的验证总是会发生,这可能就是 field2 触发失败的原因。
  • 仍然不清楚你期望在这里失败什么。 bag 视图在哪里?
  • 我认为这里不需要视图。正如我在模型中提到的 null=False 一样,应该触发数据库级验证。
  • 它应该在哪里做呢?我们不知道,因为你还没有发表你的观点

标签: django django-models django-tests


【解决方案1】:
class Bag(models.Model):
    created_on = models.DateTimeField(default=timezone.now)
    order_id = models.CharField(blank=False, null=False, max_length=100)
    order_created_time = models.DateTimeField(blank=False, null=False)

class SalesBagTestCase(TestCase):
    bag = None
    @classmethod
    def setUpTestData(cls):
        bag = Bag.objects.create(order_created_time=datetime.now())
        cls.bag = bag

    def test_bag(self):
        bag_response = self.client.get('http://localhost:8000/bag/')
        self.bag.full_clean()
        self.assertEqual(bag_response.status_code, 200)

这指出我们需要在pre-save信号中使用full_clean()方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多