在Python中模拟链式调用

3

我正在尝试使用 unittestmock 库测试以下类:

class Connection(object):
    def __init__(self, cookie):
    self.connect = None
    self.session = Session()
    self.session.load(cookie)
    # do some stuff with self.session
    self.some_info = self.session.data['the_info']

我该如何测试当我创建一个Connection实例时,根据Session实例的返回值,断言self.some_info是否具有我期望的值?我希望使用mock库。在其文档中,我有一个关于模拟链接调用的示例(http://www.voidspace.org.uk/python/mock/examples.html#mocking-chained-calls),但它并不清楚我如何将其适应到我的问题上。 Session.load(cookie)方法设置Session实例中的一些属性。我想为我的测试设置这些值,以便对于每个cookie值都是固定的。

1
你目前有什么进展? - Mahmoud Abdelkader
1个回答

3
假设Connection位于package.module.connection模块中。
以下代码应该是测试会话的方法:
import mock


class TestConnection(unittest.TestCase):

    @mock.patch('package.module.connection.Session')
    def test_some_info_on_session_is_set(self, fake_session):
        fake_session.data = {'the_info': 'blahblah'}
        cookie = Cookie()
        connection = Connection(cookie)
        self.assertEqual(connection.some_info, 'blahblah')
        fake_session.load.assert_called_once_with(cookie)

我以前不太理解修饰器(patch decorator)。在你的解答后,我再次阅读了mock文档,并发现这是实现我所需功能的更好(或者说唯一)方式。 - Renne Rocha
很不幸,如果我试图更改Session类的某些函数的返回值,那么修补程序装饰器是可以的。但是,如果我尝试更改数据字典,则测试结果为:TypeError:'Mock'对象不可订阅 - Renne Rocha
@Renne,您的问题不清楚。您到底想要做什么?您能否发布一个演示您问题的片段?此外,您的问题在这样做后已经与原来的形式不同了。 - Mahmoud Abdelkader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接