【问题标题】:Mocking super class method in python在python中模拟超类方法
【发布时间】:2015-12-16 16:44:07
【问题描述】:

我正在实现以下类:

class TestInitializeConnection(TestMyDriver)

超类(TestMyDriver)是一个TestCase,意思是:

class TestMyDriver(test.TestCase):

超类有一个名为 driver 的属性,它基本上是测试驱动程序的模拟,它声明如下:

self.driver = mocks.MyDriver()

现在在我的 (TestInitializeConnection) 中,我想实现以下测试:

def test_initialize_connection(self):
    self.driver.initialize_connection(self.volume, self.connector)

在函数initialize_connection的代码中,有一个私有方法被调用

specs = self._get_specs(volume)

我想让我的测试告诉 _get_specs(volume) 的这个调用返回一个特定的值,例如一个具有以下值的字典: {'iops': 100, '带宽': 200}

最好的方法是什么?

谢谢, 马坦

【问题讨论】:

  • 您可以遵循@Dan 的建议,但是...我的规则是避免模拟私有方法。 _get_spec() 做什么?有没有办法通过嘲笑一些合作者来获得相同的结果?是否可以进行安全的重构来帮助进行此类测试?更多地使用模拟私有方法和属性,并且您的代码更多地与测试纠缠在一起 -> 重构变得非常困难,并且您正在失去更改代码的能力,而这是测试给您带来的最大优势。

标签: python unit-testing python-unittest python-mock


【解决方案1】:

只是嘲笑它。

def test_initialize_connection(self):
  with mock.patch.object(
      self.driver, 
      '_get_specs', 
      return_value='your_fake_value') as mock_specs:
    # Do something with self.driver

【讨论】:

  • 谢谢Dan,有没有使用@patch 注释来避免with?
  • 只需使用self.driver._get_specs = mock.MagicMock() 后跟self.driver._get_specs.return_value = 'fake_value'
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多