我有与请求对象或用户对象交互的django代码。例如:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
如果您要使用django python shell或单元测试进行测试,那么您会在那里传递什么?这里只是一个User对象,但是对模拟请求对象的需求也经常出现。
对于shell或单元测试:
答案 0 :(得分:62)
对于请求,我会使用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作为@ozan建议,并且可能使用factory boy作为速度(对于工厂男孩,您可以选择不保存到DB)
答案 1 :(得分:47)
你如何嘲笑用户?
初始化django.contrib.auth.models.User
个对象。 User.objects.create_user
让这很容易。
你如何模拟请求?
初始化django.http.HttpRequest
对象。
当然,根据您的要求,有快捷方式。如果您只需要一个指向用户的user
属性的对象,只需创建一些东西(任何东西)并为其赋予该属性。
答案 2 :(得分:7)
你可以按照Anurag Uniyal的建议推出自己的模拟游戏,也可以使用模拟框架。
回应那些说你可以像在Django中那样创建一个普通用户......我建议这会破坏单元测试的重点。单元测试不应该触及数据库,但是通过创建用户,你已经改变了数据库,因此我们想要模拟一个。
答案 3 :(得分:6)
在这里阅读模拟对象
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
添加特定案例等
答案 4 :(得分:4)
您不需要模拟用户,因为您可以在测试中创建一个用户 - 测试完成后数据库将被销毁。
要模拟请求,请使用Simon Willison的this snippet。