Django模型中单元测试外键约束

1 投票
1 回答
4224 浏览
提问于 2025-04-18 14:53

我有两个模型,其中一个通过外键关系引用另一个。我想写单元测试来确保这个关系是正确的。

class X(models.Model):
    name = models.CharField(unique = True)

class Y(models.Model):
    event = models.ForeignKey(X)

在测试中,我有

class TestY(TestCase):
    x = X.objects.create(name="test1")
    x.save()
    y = Y(event=X.objects.create(name="test2"))
    with self.assertRaises(ValidationError):
        if y.full_clean()
            y.save()

    self.assert(0,Y.objects.filter(event__name="test2").count)

这表示测试失败了,ValidationError 没有被触发。

另外,如果某个字段不允许为空,我应该怎么测试 ValueError 呢? self.assertRaises(ValueError) 这个方法不管用。

1 个回答

1

你想要这样的东西吗?

class TestY(TestCase):

    def test_model_relation(self):
        x = X.objects.create(name="test1")
        y = Y(event=X.objects.create(name="test2"))
        y.full_clean()  # `event` correctly set. This should pass
        y.save()
        self.assertEqual(Y.objects.filter(event__name="test2").count(), 1)

    def test_model_relation__event_missing(self):
        x = X.objects.create(name="test1")
        y = Y()  # Y without `event` set
        with self.assertRaises(ValidationError):
            y.full_clean()
            y.save()
        self.assertEqual(Y.objects.filter(event__name="test2").count(), 0)

顺便说一下,你应该在测试方法中指定测试(也就是那些名字以 test 开头的方法),而不是在类的主体部分。

撰写回答