Подтвердить что ты не робот

Как издеваться над пользователями и запросами в django

У меня есть код django, который взаимодействует с объектами запроса или объектами пользователя. Например, например:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

Если бы вы собирались протестировать оболочку python django или в unittest, что бы вы прошли там? Здесь просто будет создан объект User, но часто возникает потребность в объекте mock request.

Для оболочки или для unittests:

  • Как вы издеваетесь над пользователями?
  • Как вы издеваетесь над запросами?
4b9b3361

Ответ 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

Вам не нужно издеваться над пользователями, поскольку вы можете просто создать его в своем тесте - база данных будет уничтожена после завершения теста.

Чтобы издеваться над запросами, используйте этот фрагмент от Саймона Уиллисона.