如何在django中嘲笑用户和请求
我有与请求对象或用户对象交互的Django代码。 比如像这样的东西:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
如果你打算用django python shell或unit testing来testing,你会在那里通过什么? 这里只需要一个User对象,但是对于一个模拟请求对象的需求也经常出现。
对于shell或unittests:
- 你如何嘲笑用户?
- 你如何嘲笑请求?
对于请求,我会使用Django中包含的RequestFactory 。
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作为@ozanbuild议,也许与工厂男孩的速度(工厂男孩,你可以select不保存到DB)
你如何嘲笑用户?
初始化一个django.contrib.auth.models.User
对象。 User.objects.create_user
使这个很简单。
你如何嘲笑请求?
初始化一个django.http.HttpRequest
对象。
当然,这取决于你想做什么。 如果你只需要一个user
属性指向一个用户的对象,只需创build一些东西(任何东西),并给它的属性。
你可以按照Anurag Uniyal的build议推出自己的模拟游戏,也可以使用模拟框架。
为了回应那些说你可以创build一个普通的用户,就像在Django中那样…我build议这样做会打败unit testing的重点。 unit testing不应该触及数据库,而是通过创build一个用户,你已经改变了数据库,所以我们为什么要模拟一个。
在这里阅读模拟对象
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
添加特定案例等
您不需要模拟用户,因为您可以在testing中创build一个用户,testing完成后数据库将被销毁。
要嘲笑请求,请使用Simon Willison的这段代码 。