Python mock 创建假对象时返回字典,任何属性被使用时都会如此

3 投票
2 回答
9678 浏览
提问于 2025-04-18 17:43

举个例子,我在Django里有一个方法,它会重复使用请求对象:

def dowork(request):
    # the sessionid is a query param of the callback from payment gateway
    print request.GET.get('sessionid')

当我写单元测试的时候,我需要创建一个假的请求对象,这个对象应该有一个GET属性,并且里面要包含一个字典{'sessionid': 'blah'}

我该如何使用mock这个工具来做到这一点呢?

2 个回答

0

你为什么不使用内置的测试客户端呢?这个客户端已经支持模拟会话了。

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

你可以通过创建一个模拟对象来做到这一点,然后像对待其他Python对象一样设置它的属性。

唯一需要注意的是,模拟对象是特别设计的,它的属性会自动用模拟对象填充,这样做起来非常简单。你不需要手动为每个属性都创建一个模拟对象。

比如说,

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')

撰写回答