如何在 Django 测试中获取用户?

Use*_*007 3 django webtest django-testing

我有一些外部服务。我的 Django 应用程序建立在我的外部服务 API 之上。为了与我的外部服务对话,我必须传入一个 auth cookie,我可以通过读取User(那个 cookie != django cookie)来获取它。

使用测试工具,例如webtestsrequests我有麻烦写我的测试。

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()
Run Code Online (Sandbox Code Playgroud)

我需要提交一个表单,它会在我的外部服务上创建一个用户。但要做到这一点,我通常会传入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
    .......
Run Code Online (Sandbox Code Playgroud)

我得到

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
Run Code Online (Sandbox Code Playgroud)

但是如果我测试User.objectsin 视图,我就可以了。

Tod*_*odd 5

您需要使用 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')
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您打算使用多个方法来测试不同的功能,您应该在为下一个测试重新实例化对象之前使用 tearDown 方法销毁对象。这是我花了一段时间才最终弄清楚的事情,所以我会为您省去麻烦。

def tearDown(self):
        # Clean up after each test
        self.user_1.delete()
        self.user_2.delete()
        self.user_3.delete()
Run Code Online (Sandbox Code Playgroud)

  • 除了 todd 所说的,如果您有一个使用 djangos 身份验证系统的视图,您也可以使用测试客户端登录您的用户!https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.login (3认同)