it-swarm.com.ru

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

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

foo_model_instance = models.get_or_create_foo_from_user(request.user)

Если бы вы собирались провести тестирование в оболочке Django python или в юнит-тесте, что бы вы там пропустили? Здесь просто подойдет объект User, но часто возникает необходимость в объекте фиктивного запроса.

Для Shell или для юнит-тестов:

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

Для запроса я бы использовал 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 boy вы можете не сохранять в БД)

62
naoko

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

Инициализируйте объект Django.contrib.auth.models.User. User.objects.create_user это легко.

Как вы издеваетесь над запросами?

Инициализируйте объект Django.http.HttpRequest .

Конечно, есть ярлыки в зависимости от того, что вы хотите сделать. Если вам просто нужен объект с атрибутом user, который указывает на пользователя, просто создайте что-нибудь (что угодно) и присвойте ему этот атрибут.

47
ozan

Вы можете бросить свои собственные макеты, как предложил Anurag Uniyal, или вы можете использовать фальшивые рамки.

В ответ на те, кто говорит, что вы можете просто создать обычного пользователя, как в любом случае в Django ... Я хотел бы предложить, что это побеждает точку модульного теста. Модульное тестирование не должно касаться базы данных, но, создав пользователя, вы изменили базу данных, поэтому мы хотели бы ее смоделировать.

7
Michael Williamson

Читайте о ложных объектах здесь
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

И используйте эту python lib, чтобы издеваться над пользователем
http://python-mock.sourceforge.net/

иначе вы можете написать простой класс User самостоятельно, используйте это как отправную точку

class MockUser(object):
    def __call__(self, *args, **kwargs):
        return self

    def __getattr__(Self, name):
        return self

добавить конкретные случаи и т. д.

6
Anurag Uniyal

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

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

4
Daniel Roseman