Как издеваться над пользователями и запросами в Django - PullRequest
65 голосов
/ 10 января 2010

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

foo_model_instance = models.get_or_create_foo_from_user(request.user)

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

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

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

Ответы [ 5 ]

63 голосов
/ 14 сентября 2014

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

47 голосов
/ 10 января 2010

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

Инициализировать django.contrib.auth.models.User объект. User.objects.create_user позволяет легко.

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

Инициализировать django.http.HttpRequest объект.

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

7 голосов
/ 10 января 2010

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

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

6 голосов
/ 10 января 2010

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

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

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

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

    def __getattr__(Self, name):
        return self

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

4 голосов
/ 10 января 2010

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

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

...