在Python中模拟链式调用

3 投票
1 回答
4049 浏览
提问于 2025-04-16 13:47

我正在尝试使用 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 个回答

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)

撰写回答