我有一些外部服务。我的Django应用程序是基于我的外部服务API构建的。为了与我的外部服务交谈,我必须传递一个auth cookie,我可以通过阅读User
(那个cookie!= django cookies)来获取。
使用webtests
,requests
等测试工具,我在撰写测试时遇到了麻烦。
class MyTestCase(WebTest):
def test_my_view(self):
#client = Client()
#response = client.get(reverse('create')).form
form = self.app.get(reverse('create'), user='dummy').form
print form.fields.values()
form['name'] = 'omghell0'
print form
response = form.submit()
我需要提交一个表单,例如,在我的外部服务上创建一个用户。但要做到这一点,我通常会传入request.user
(为了验证我对外部服务的特权)。但我没有request.user
。
我对这类东西有什么选择?
...谢谢
假设这是我的tests.py
import unittest
from django.test.client import Client
from django.core.urlresolvers import reverse
from django_webtest import WebTest
from django.contrib.auth.models import User
class SimpleTest(unittest.TestCase):
def setUp(self):
self.usr = User.objects.get(username='dummy')
print self.usr
.......
我得到了
Traceback (most recent call last):
File "/var/lib/graphyte-webclient/webclient/apps/codebundles/tests.py", line 10, in setUp
self.usr = User.objects.get(username='dummy')
File "/var/lib/graphyte-webclient/graphyte-webenv/lib/python2.6/site-packages/django/db/models/manager.py", line 132, in get
return self.get_query_set().get(*args, **kwargs)
File "/var/lib/graphyte-webclient/graphyte-webenv/lib/python2.6/site-packages/django/db/models/query.py", line 341, in get
% self.model._meta.object_name)
DoesNotExist: User matching query does not exist
但如果我在视图中测试User.objects
,我没关系。
答案 0 :(得分:4)
您需要使用setUp()方法来创建用于测试的测试用户 - 测试从不使用实时数据,但会创建一个临时测试数据库来运行您的单元测试。阅读本文以获取更多信息:https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#writing-unit-tests
编辑:
以下是一个例子:
from django.utils import unittest
from django.contrib.auth.models import User
from myapp.models import ThisModel, ThatModel
class ModelTest(unittest.TestCase):
def setUp(self):
# Create some users
self.user_1 = User.objects.create_user('Chevy Chase', 'chevy@chase.com', 'chevyspassword')
self.user_2 = User.objects.create_user('Jim Carrey', 'jim@carrey.com', 'jimspassword')
self.user_3 = User.objects.create_user('Dennis Leary', 'dennis@leary.com', 'denisspassword')
另请注意,如果要使用多种方法来测试不同的功能,则应在使用tearDown方法销毁对象之前将其重新实例化以用于下一次测试。这件事花了我一段时间才最终弄明白,所以我会省你麻烦。
def tearDown(self):
# Clean up after each test
self.user_1.delete()
self.user_2.delete()
self.user_3.delete()
答案 1 :(得分:1)
Django建议使用单元测试或文档测试,如here所述。您可以将这些测试放入每个apps目录中的tests.py中,并在使用命令`python manage.py test'时运行。
Django为单元测试提供了非常有用的类和函数,如here所述。特别是,类django.test.Client
非常方便,可以控制用户之类的内容。
答案 2 :(得分:1)
https://docs.djangoproject.com/en/1.4/topics/testing/#module-django.test.client
使用django测试客户端模拟请求。如果您需要测试返回结果的行为,请使用Selenium。