在Django中测试重写的保存方法

时间:2014-11-10 17:24:16

标签: python django testing django-models

我有一个带有重写保存方法的Django模型,以确保只为同一个模型的一个实例设置一个特殊字段(标志)。

class MyModel(models.Model):

    flag = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if self.flag:
            for o in MyModel.objects.filter(flag=True):
                if o != self:
                    o.flag = False
                    o.save()
        super(MyModel, self).save(*args, **kwargs)

然后我写了一个测试来确保预期的行为有效。

from django.test import TestCase
from myapp.models import MyModel

class MyAppFlag(TestCase):

    def test_flag_is_set_only_once(self):
        o1 = MyModel(flag=True)
        o1.save()
        self.assertEqual(o1.flag, True)

        o2 = MyModel(flag=True)
        o2.save()
        self.assertEqual(o2.flag, True)
        self.assertEqual(o1.flag, False)

不幸的是,最后一个断言失败了。我不明白为什么,因为一般来说,它在管理界面中测试行为时是有效的(即不在测试套件中)。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

您尚未从数据库重新加载o1。当db执行时,模型实例不会自动更新:您需要显式获取更新的数据。

o1 = MyModel.objects.get (pk=o1.pk)
self.assertEqual(o1.flag, False)

请注意,您的保存方法非常低效:最好在一个查询中执行:

MyModel.objects.filter(flag=True).exclude(pk=self.pk).update(flag=False)