Как издеваться над пользователями и запросами в django
У меня есть код django, который взаимодействует с объектами запроса или объектами пользователя. Например, например:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
Если бы вы собирались протестировать оболочку python django или в unittest, что бы вы прошли там? Здесь просто будет создан объект User, но часто возникает потребность в объекте mock request.
Для оболочки или для unittests:
- Как вы издеваетесь над пользователями?
- Как вы издеваетесь над запросами?
Ответы
Ответ 1
Для запроса я использовал RequestFactory, включенный в Django.
from django.test.client import RequestFactory
rf = RequestFactory()
get_request = rf.get('/hello/')
post_request = rf.post('/submit/', {'foo': 'bar'})
для пользователей, я бы использовал django.contrib.auth.models.User, как предложил @ozan, и, возможно, с factory boy для скорости (с factory мальчик, который вы можете не сохранять в БД)
Ответ 2
Как вы издеваетесь над пользователями?
Инициализировать объект django.contrib.auth.models.User
. User.objects.create_user
делает это легко.
Как вы издеваетесь над запросами?
Инициализируйте объект django.http.HttpRequest
.
Конечно, есть ярлыки в зависимости от того, что вы хотите сделать. Если вам нужен только объект с атрибутом user
, который указывает на пользователя, просто создайте что-нибудь (что-либо) и дайте ему этот атрибут.
Ответ 3
Читайте о макетных объектах здесь
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/
И используйте эту библиотеку python для издевки пользователя
http://python-mock.sourceforge.net/
еще вы можете написать простой класс пользователя самостоятельно, использовать это в качестве отправной точки
class MockUser(object):
def __call__(self, *args, **kwargs):
return self
def __getattr__(Self, name):
return self
добавить specfic cases и т.д. и т.д.
Ответ 4
Вы можете либо бросить свои собственные макеты, как предложил Anurag Uniyal, либо вы можете использовать насмешливую структуру.
В ответ тем, кто говорит, что вы можете просто создать обычного пользователя так же, как и в Django... Я бы предположил, что это побеждает точку unit test. A unit test не должен касаться базы данных, но, создав пользователя, вы изменили базу данных, поэтому мы хотели бы издеваться над ней.
Ответ 5
Вам не нужно издеваться над пользователями, поскольку вы можете просто создать его в своем тесте - база данных будет уничтожена после завершения теста.
Чтобы издеваться над запросами, используйте этот фрагмент от Саймона Уиллисона.