我有与请求对象或用户对象进行交互的Django代码。例如:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
如果要使用django python shell进行测试或在单元测试中进行测试,您将在其中传递什么?这里只是一个User对象即可,但是对模拟请求对象的需求也经常出现。
对于外壳程序或单元测试:
- 您如何嘲笑用户?
- 您如何模拟请求?
我有与请求对象或用户对象进行交互的Django代码。例如:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
如果要使用django python shell进行测试或在单元测试中进行测试,您将在其中传递什么?这里只是一个User对象即可,但是对模拟请求对象的需求也经常出现。
对于外壳程序或单元测试:
Answers:
对于请求,我将使用Django随附的RequestFactory。
from django.test.client import RequestFactory
rf = RequestFactory()
get_request = rf.get('/hello/')
post_request = rf.post('/submit/', {'foo': 'bar'})
对于用户,我将按照@ozan的建议使用django.contrib.auth.models.User,并可能与factory boy提速(对于factory boy,您可以选择不保存到DB)
request.user
设置当前版本。同样也可以像普通视图一样使用此请求,很高兴可以将其包含request.csrf_processing_done = True
在就绪请求中(通过CSRF检查)
您如何嘲笑用户?
初始化一个django.contrib.auth.models.User
对象。User.objects.create_user
使这变得容易。
您如何模拟请求?
初始化一个 django.http.HttpRequest
对象。
当然,根据您要执行的操作有一些快捷方式。如果您只需要一个对象,该对象具有user
指向用户的属性,则只需创建任何内容(任何内容)并将其赋予该属性即可。
User
于此问题的一部分)。如果您不认为模拟比实际访问数据库要快,那么我怀疑您实际上并没有尝试和比较过。在一个很小的项目中,当我们更改代码以模拟模型时,我们的团队从测试套件花费了1.5分钟到不到5秒。如果差距太大,则无需编写基准。
.user
属性。实例django.http.HttpRequest
没有。创建后,我只是设置request.user。看起来合理吗?
您可以按照Anurag Uniyal的建议滚动自己的模拟,也可以使用模拟框架。
回应那些说法,就像在Django中一样,您可以创建一个普通用户...我建议这样做会破坏单元测试的目的。单元测试不应该涉及数据库,但是通过创建用户,您已经更改了数据库,因此我们为什么要模拟一个数据库。
在此处了解有关模拟对象的信息
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
添加特定案例等
您无需模拟用户,因为您可以在测试中创建一个用户-测试完成后数据库将销毁。
要模拟请求,请使用Simon Willison的此代码段。