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

时间:2010-01-10 05:20:47

标签: python django unit-testing mocking

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

foo_model_instance = models.get_or_create_foo_from_user(request.user)

如果您要使用django python shell或单元测试进行测试,那么您会在那里传递什么?这里只是一个User对象,但是对模拟请求对象的需求也经常出现。

对于shell或单元测试:

  • 你如何嘲笑用户?
  • 你如何模拟请求?

5 个答案:

答案 0 :(得分:62)

对于请求,我会使用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作为速度(对于工厂男孩,您可以选择不保存到DB)

答案 1 :(得分:47)

  

你如何嘲笑用户?

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

  

你如何模拟请求?

初始化django.http.HttpRequest对象。

当然,根据您的要求,有快捷方式。如果您只需要一个指向用户的user属性的对象,只需创建一些东西(任何东西)并为其赋予该属性。

答案 2 :(得分:7)

你可以按照Anurag Uniyal的建议推出自己的模拟游戏,也可以使用模拟框架。

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

答案 3 :(得分:6)

在这里阅读模拟对象
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

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

否则你可以自己编写一个简单的User类,以此为出发点

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

    def __getattr__(Self, name):
        return self

添加特定案例等

答案 4 :(得分:4)

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

要模拟请求,请使用Simon Willison的this snippet