在Django测试中,我应该如何保存数据库对象然后从数据库中检索它?

Ser*_*Ala 3 python django

我正在使用Django 1.8.我编写了以下代码来测试一个pre_save钩子是否正常工作,但是这段代码看起来非常不优雅.这是编写此类单元测试的"正确方法"吗?

class PreSaveTests(TestCase):
    def test_pre_save_hook(self):
        person = Person(name="Joe")
        person.save()
        person2 = Person.objects.get(pk = person.pk)
        # Confirm that the pre_save hook ran.
        # The hook sets person.is_cool to True.
        self.assertEqual(person2.is_cool, True)
Run Code Online (Sandbox Code Playgroud)

这很好用,但看起来很难看.

真正丑陋的部分是,person并且person2是相同的数据库对象.唯一的区别是person2从数据库中检索到的.

Fra*_*ant 6

你在考试中所做的一切都很好.但是,我认为你可以简化/改进它.

我认为你应该使用工厂(你可以使用FactoryBoy).这样,在模型上添加/删除必填字段时,您无需更新测试.此外,您可以从测试中删除不相关的信息.在这种情况下,人名的事实Joe完全无关紧要.

你可以替换:

person = Person(name="Joe")
person.save()
Run Code Online (Sandbox Code Playgroud)

有:

person = PersonFactory.create()
Run Code Online (Sandbox Code Playgroud)

正如Daniel所说,您不需要重新加载Person实例.所以你不必这样做:

person2 = Person.objects.get(pk = person.pk)
Run Code Online (Sandbox Code Playgroud)

最后,小提示,你可以用assertTrue而不是assertEquals(something, True):

class PreSaveTests(TestCase):

    def test_pre_save_hook(self):
        person = PersonFactory.create()
        self.assertTrue(person.is_cool)
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 5

首先,我不确定您为什么认为这很丑陋:似乎是测试此功能的完全合理的方法。

但是,你绝对可以让它更简单。尽管 Django 实例没有身份——也就是说,从数据库中分别检索的两个实例在保存和检索之前不会共享修改——当预保存挂钩运行时,它会修改现有实例。所以实际上person 得到修改设置is_cool,所以不需要检索和检查person2