Django - 单元测试AdminForm

时间:2013-06-18 00:32:01

标签: python-2.7 django-admin tdd django-testing django-unittest

我对单元测试很新,可能做错了,但是当我通过管理员后端模拟帖子来更新模型时,似乎我的AdminForm中的save_model方法没有被调用。我试图测试这种方法 - 我做错了什么?

我的第二个不太相关的问题一般是如何在使用单元测试时确保调用方法?有没有办法列出所有被击中的方法?

以下是我的测试运行的代码。在我的AdminForm中针对此模型的save_model方法中,我将此模型的foobar属性设置为当前登录用户的用户名。以下是我的测试:

self.client = Client()
self.client.login(username='username',password='password')
# self.dict is a dictionary of field names and values for mymodel to be updated
response = self.client.post('/admin/myapp/mymodel/%d/' % self.mymodel.id, self.dict)
self.assertEqual(response.status_code,200) # passes
self.assertEqual(self.mymodel.foobar,'username') # fails
self.client.logout()

失败是因为它说self.mymodel.foobar是一个空字符串。这是在更新之前本应该做的。在self.dict中没有传递foobar的值,但我的save_model方法旨在在更新发生时自行设置它。值得注意的是,我的代码工作正常,save_model似乎工作正常,只是我的测试失败了。由于我是TDD的总菜鸟,我确信这个问题与我的测试有关,而不是我的代码。想法?

1 个答案:

答案 0 :(得分:0)

从代码看起来问题是,在发布表单后,您不会从数据库重新加载self.mymodel。如果持有对存储在数据库中的模型对象的引用,并且在数据库中更改了该对象上的一个或多个字段,则需要从数据库重新加载该对象以查看更新的值。如this question中所述,您可以使用以下内容执行此操作:

self.mymodel = MyModelClass.objects.get(id=self.mymodel.id)

要回答您的第二个问题,查看正在发生的事情的最有用方法可能是使用日志记录来输出save_model方法中发生的情况 - 这不仅可以帮助您在测试期间调试问题,但是如果在运行应用程序时遇到此方法的任何问题。 django日志记录指南提供了很好的介绍:

https://docs.djangoproject.com/en/dev/topics/logging/