【问题标题】:Mocking chained calls in Python在 Python 中模拟链式调用
【发布时间】:2011-07-16 05:05:05
【问题描述】:

我正在尝试使用 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 是否具有我期望的值?

我希望使用模拟库。在其文档中,我有一个模拟链式调用的示例 (http://www.voidspace.org.uk/python/mock/examples.html#mocking-chained-calls),但我不太清楚如何使其适应我的问题。

Session.load(cookie) 方法在Session 实例中设置一些属性。我想为我的测试为每个 cookie 值设置固定的值。

【问题讨论】:

  • 到目前为止你有什么?

标签: python unit-testing mocking python-mock


【解决方案1】:

假设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)

【讨论】:

  • 之前对补丁装饰器不太了解。在您回答之后,我再次阅读了模拟文档,发现这是完成我需要的更好的方法(或唯一的方法:-)。
  • 不幸的是,如果我尝试更改 Session 类的某些函数的返回,补丁装饰器是可以的。但是如果我尝试更改数据字典,测试结果为:TypeError: 'Mock' object is not subscriptable
  • @Renne 您的问题不清楚。你到底想做什么?你能发一个sn-p来证明你的问题吗?此外,因此,您的问题与原来的形式不同。
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2011-12-17
  • 2015-08-23
  • 1970-01-01
相关资源
最近更新 更多