如何在Django中模拟用户和请求
我有一些Django代码,它会和请求对象或者用户对象进行交互。比如像这样:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
如果你想在Django的Python命令行或者单元测试中进行测试,你会传入什么呢?这里简单来说,一个用户对象就可以了,但有时候也需要一个模拟的请求对象。
对于命令行或者单元测试:
- 你怎么模拟用户呢?
- 你怎么模拟请求呢?
6 个回答
7
你可以自己写一些模拟数据,就像Anurag Uniyal提到的那样,或者你也可以使用一个专门的模拟框架。
对于那些说你可以像平常一样在Django中创建一个普通用户的人,我想说这样做其实违背了单元测试的初衷。单元测试不应该去操作数据库,但如果你创建了一个用户,就意味着你改变了数据库的内容,这就是我们想要使用模拟的原因。
54
如何模拟用户?
你可以创建一个 django.contrib.auth.models.User
对象。使用 User.objects.create_user
这个方法会让你轻松搞定。
如何模拟请求?
你可以创建一个 django.http.HttpRequest
对象。
当然,根据你想做的事情,有一些简化的方法。如果你只需要一个带有 user
属性的对象,指向某个用户,那你只需创建一个对象(什么都可以),然后给它加上这个属性就行了。
114
对于请求,我会使用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来提高速度(使用factory boy时,你可以选择不保存到数据库中)。