0

我对单元测试非常陌生,并且可能做错了什么,但是当我模拟帖子以通过管理后端更新模型时,似乎save_model没有调用我在 AdminForm 中的方法。我正在尝试测试这种方法 - 我做错了什么?

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

下面是我的测试正在运行的代码。在save_model此模型的 AdminForm 方法中,我将此模型的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是一个空字符串。更新前应该是这样的。foob​​ar 没有传递任何值,self.dict但我的save_model方法旨在在更新发生时自行设置。还值得注意的是,我的代码工作正常并且save_model似乎工作正常,只是我的测试失败了。由于我是 TDD 的菜鸟,我确信问题出在我的测试而不是我的代码上。想法?

4

1 回答 1

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/

于 2013-06-18T18:23:44.413 回答