2012-03-27 1 views
2

У меня есть внешние службы. Приложение Django построено поверх моих внешних API сервисов. Чтобы поговорить с моей внешней службой, я должен передать файлы cookie, которые я могу получить, прочитав User (это cookie! = Django cookie).Как я могу получить пользователя в тесте Djano?

Использование тестовых инструментов, таких как 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 во взглядах, я в порядке ,

ответ

4

You ne ed для использования метода setUp() для создания тестовых пользователей для тестирования - тестирование никогда не использует живые данные, а создает временную тестовую базу данных для запуска модульных тестов. Прочитайте это для получения дополнительной информации: https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#writing-unit-tests

EDIT:

Вот пример:

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', '[email protected]', 'chevyspassword') 
     self.user_2 = User.objects.create_user('Jim Carrey', '[email protected]', 'jimspassword') 
     self.user_3 = User.objects.create_user('Dennis Leary', '[email protected]', 'denisspassword') 

отметить также, что, если вы собираетесь использовать более чем один метод, чтобы проверить различные функциональные возможности, вы должны использовать метод tearDown для уничтожения объектов, прежде чем восстанавливать их для следующего теста. Это то, что мне понадобилось, чтобы наконец разобраться, поэтому я избавлю вас от неприятностей.

def tearDown(self): 
     # Clean up after each test 
     self.user_1.delete() 
     self.user_2.delete() 
     self.user_3.delete() 
+2

В дополнение к тому, что сказал todd, если у вас есть представление, использующее систему проверки подлинности djangos, вы также можете зарегистрировать своего пользователя с помощью тестового клиента! https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.login – dm03514

+0

@Todd B спасибо. Это было очень полезно! То же самое относится к dm03514 – User007

1

Django рекомендует использовать либо модульные тесты, либо doc-тесты, как описано here. Эти тесты можно поместить в test.py в каждом каталоге приложений, и они будут выполняться при использовании команды `python manage.py test '.

Django предоставляет очень полезные классы и функции для модульного тестирования, как описано here. в частности, класс django.test.Client очень удобно, и позволяет управлять работой пользователей.

+0

Спасибо. Думаю, я должен продолжать здесь? Я протестировал этот 'User.objects.get (username = 'dummy')' в моих представлениях, который вернет мне «манекен». Но если я поместил это в свой тест, я получаю сообщение об ошибке «DoNotExist: запрос соответствия пользователя не существует». Почему? – User007

+1

В ваших модульных тестах все базы данных начинаются полностью пустыми (чтобы их поведение было предсказуемым, и поэтому оно не влияет на вашу реальную базу данных). Посмотрите инструменты - вы можете сбросить свой SQL в a.json-файл и иметь тестовую нагрузку, которая, как ее база данных, перед тестированием –