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