如何在django中嘲笑用户和请求

我有与请求对象或用户对象交互的Django代码。 比如像这样的东西:

foo_model_instance = models.get_or_create_foo_from_user(request.user) 

如果你打算用django python shell或unit testing来testing,你会在那里通过什么? 这里只需要一个User对象,但是对于一个模拟请求对象的需求也经常出现。

对于shell或unittests:

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

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

你如何嘲笑用户?

初始化一个django.contrib.auth.models.User对象。 User.objects.create_user使这个很简单。

你如何嘲笑请求?

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

当然,这取决于你想做什么。 如果你只需要一个user属性指向一个用户的对象,只需创build一些东西(任何东西),并给它的属性。

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

为了回应那些说你可以创build一个普通的用户,就像在Django中那样…我build议这样做会打败unit testing的重点。 unit testing不应该触及数据库,而是通过创build一个用户,你已经改变了数据库,所以我们为什么要模拟一个。

在这里阅读模拟对象
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 

添加特定案例等

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

要嘲笑请求,请使用Simon Willison的这段代码 。