【发布时间】:2014-07-26 16:40:27
【问题描述】:
我正在使用 Django 的内置测试客户端为我的视图创建单元测试,以创建模拟请求。 我正在调用的视图应该在数据库中创建一个对象。但是,当我从测试方法中查询数据库时,该对象不存在 - 它要么尚未创建,要么在从视图返回时被丢弃。
这是视图:
def apply_to_cmp(request, campaign_id):
""" Creates a new Application to 'campaign_id' for request.user """
campaign = Campaign.objects.get(pk = campaign_id)
if not Application.objects\
.filter(campaign = campaign, user = request.user)\
.exists():
application = Application(**{'campaign' : campaign,
'user' : request.user})
application.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
这是调用它的测试:
def test_create_campaign_app(self):
""" Calls the method apply_to_cmp in .views """
c = Client()
c.login(username = self.username, password = self.password)
url = '/campaign/' + self.campaign.id + '/apply/'
response = c.get(url)
# Check whether request was successful (should return 302: redirect)
self.assertEqual(response.status_code, 302)
# Verify that an Application object was created
app_count = Application.objects\
.filter(user = self.user, campaign = self.campaign)\
.count()
self.assertEqual(app_count, 1)
这是运行测试的输出:
Traceback (most recent call last):
File "/test_views.py", line 40, in test_create_campaign_app
self.assertEqual(app_count, 1)
AssertionError: 0 != 1
apply_to_cmp 方法肯定被调用,因为response.status_code == 302,但仍然没有创建 Application 对象。我做错了什么?
编辑:解决方案
Client.login 失败,因为登录系统没有在setUp 方法中正确初始化。我通过使用包含登录系统设置的initial_data.json 调用call_command('loaddata', 'initial_data.json') 来解决此问题。此外,HttpResponseRedirect(request.META.get('HTTP_REFERER')) 没有工作,原因很明显。我把那一点改成
if request.META.get('HTTP_REFERER'):
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
return HttpResponse()
因此测试
self.assertEqual(response.status_code, 200)
感谢您的帮助!
【问题讨论】:
标签: python django unit-testing python-3.x