Python mock创建一个伪对象,当其中任何一个';将使用s属性

Python mock创建一个伪对象,当其中任何一个';将使用s属性,python,django,unit-testing,mocking,python-mock,Python,Django,Unit Testing,Mocking,Python Mock,例如,我在Django中有一个重用请求对象的方法: def dowork(request): # the sessionid is a query param of the callback from payment gateway print request.GET.get('sessionid') 当我编写unittest时,我需要创建一个伪请求对象,它应该具有GET属性,并且应该包含一个字典{'sessionid':'blah'} 如何使用模拟包实现这一点?为什么不使用内

例如,我在Django中有一个重用请求对象的方法:

def dowork(request):
    # the sessionid is a query param of the callback from payment gateway
    print request.GET.get('sessionid')
当我编写unittest时,我需要创建一个伪请求对象,它应该具有
GET
属性,并且应该包含一个字典
{'sessionid':'blah'}


如何使用模拟包实现这一点?

为什么不使用内置的,它已经支持模拟会话了

def test_dowork(self):
    session = self.client.session
    session = ['sessionid'] = 'blah'
    session.save()
    response = self.client.get('/dowork/')
    self.assertEqual(...)

要做到这一点,可以创建一个mock,并像其他python对象一样设置其属性

唯一需要注意的是,mock是专门化的,因此它们的属性会自动填充mock,这使得这非常容易。您不需要显式地将每个属性创建为模拟对象

比如说,

import mock
mock_request = mock.Mock()

mock_request.GET.get.return_value = {'sessionid': 'blah'}

x = mock_request.GET.get('sessionid')

assert x == {'sessionid': 'blah'}
mock_request.GET.get.assert_called_once_with('sessionid')

您好,
sessionid
是一个查询参数,来自我们的信用卡网关的回调。当我调用
request.GET.GET('sessionid')
时,它返回
{'sessionid':'blah'}
,预期结果应该返回'blah'好的,我已经根据您的回答计算出了它。
mock_request.GET.GET.return_value='blah'