如何在Django中模拟用户和请求

90 投票
6 回答
66514 浏览
提问于 2025-04-15 17:51

我有一些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时,你可以选择不保存到数据库中)。

撰写回答