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

nkoocmlb  于 2023-02-10  发布在  Go
关注(0)|答案(6)|浏览(157)

我有一些django代码可以与请求对象或用户对象交互,例如:

foo_model_instance = models.get_or_create_foo_from_user(request.user)

如果你打算用djangopython shell或者单元测试来测试,你会在那里传递什么呢?这里只需要一个User对象就可以了,但是经常需要一个mock request对象。
对于 shell 或单元测试:

  • 如何模拟用户?
  • 你怎么能嘲笑别人的请求呢?
ndh0cuux

ndh0cuux1#

对于请求,我会使用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作为@奥赞建议,也许与factory boy的速度(与工厂男孩你可以选择不保存到DB)

w51jfk4q

w51jfk4q2#

如何模拟用户?
初始化一个django.contrib.auth.models.User对象。User.objects.create_user使这变得很容易。
你怎么能嘲笑别人的请求呢?
初始化django.http.HttpRequest对象。
当然,根据您想要做什么,也有一些快捷方式,如果您只需要一个具有user属性的对象,该属性指向一个用户,那么只需创建一些东西(任何东西)并赋予它该属性。

vmjh9lq9

vmjh9lq93#

您可以像AnuragUniyal建议的那样创建自己的模拟,也可以使用模拟框架。
对于那些说你可以像在Django中一样创建一个普通用户的人,我认为这破坏了单元测试的意义。单元测试不应该触及数据库,但是通过创建一个用户,你已经改变了数据库,因此我们想要模拟一个。

hmmo2u0o

hmmo2u0o4#

您不需要模拟用户,因为您可以在测试中创建一个用户-测试完成后数据库将被销毁。
要模拟请求,请使用Simon Willison的this snippet

cbeh67ev

cbeh67ev5#

在此处阅读模拟对象
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

增加具体案例等

qlvxas9a

qlvxas9a6#

已经有很多很好的一般性答案了。下面是一个简单的模拟用户,用于涉及admin表单的测试:

class MockUser:
    is_active = True
    is_staff = True

    def has_perm(self, *args):
        return True

from django.test.client import RequestFactory
request = RequestFactory().get("/some/url")
request.user = MockUser()

相关问题