代码之家  ›  专栏  ›  技术社区  ›  Purrell

如何在Django模拟用户和请求

  •  60
  • Purrell  · 技术社区  · 15 年前

    我有与请求对象或用户对象交互的Django代码。例如:

    foo_model_instance = models.get_or_create_foo_from_user(request.user)
    

    如果您要用django python shell或在unittest中进行测试,您将在其中传递什么?这里只需要一个用户对象,但是对模拟请求对象的需求也经常出现。

    对于外壳或单元测试:

    • 你怎么嘲笑用户?
    • 你如何嘲笑请求?
    5 回复  |  直到 9 年前
        1
  •  59
  •   Flimm D. Ben Knoble    9 年前

    对于请求,我将使用 RequestFactory 包括在Django中。

    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 对于速度(对于工厂男孩,您可以选择不保存到数据库)

        2
  •  45
  •   ozan    15 年前

    你怎么嘲笑用户?

    初始化一个 django.contrib.auth.models.User 对象。 User.objects.create_user 这很容易。

    你如何嘲笑请求?

    初始化一个 django.http.HttpRequest 对象。

    当然,根据你想做什么,有一些捷径。如果你只需要一个物体 user 指向用户的属性,只需创建一些东西(任何东西)并赋予它该属性。

        3
  •  7
  •   Michael Williamson    15 年前

    正如Anurag Uniyal所建议的,您可以滚动自己的模拟,也可以使用模拟框架。

    为了回应那些说你可以像在Django一样创建一个普通的用户…我建议这会破坏单元测试的要点。单元测试不应该接触数据库,但是通过创建用户,您已经更改了数据库,因此我们为什么要模拟一个数据库。

        4
  •  6
  •   Anurag Uniyal    14 年前

    阅读此处的模拟对象
    http://en.wikipedia.org/wiki/Mock_object
    http://www.mockobjects.com/

    并使用这个python lib模拟用户
    http://python-mock.sourceforge.net/

    否则,您可以自己编写一个简单的用户类,将其作为起点。

    class MockUser(object):
        def __call__(self, *args, **kwargs):
            return self
    
        def __getattr__(Self, name):
            return self
    

    添加特定案例等

        5
  •  4
  •   Daniel Roseman    15 年前

    您不需要模拟用户,因为您只需在测试中创建一个-测试完成后数据库将被销毁。

    要模拟请求,请使用 this snippet 来自西蒙·威利森。