gpt4 book ai didi

python - 使用 @patch 装饰器模拟类属性

转载 作者:行者123 更新时间:2023-11-30 22:12:40 28 4
gpt4 key购买 nike

如何使用 @patch 装饰器模拟被测类的对象属性?

给出以下测试:

def test_hangup(self):
stub_call = Mock()

cut = TelefonyInterface()
cut.call = stub_call
cut.hangup()

self.assertEqual(1, stub_call.hangup.call_count)
self.assertEqual(None, cut.call)

我想在此处使用 mock.patch 装饰器以使其更易于阅读。像这样的事情:

@patch.object(TelefonyInterface, 'call')
def test_hangup(self, call):
cut = TelefonyInterface()
cut.hangup()

self.assertEqual(1, call.hangup.call_count)
self.assertEqual(None, cut.call)

但我收到以下 AttributeError:

AttributeError: <class '(...).TelefonyInterface'> does not have the attribute 'call'

我的 TelefonyInterface 看起来像这样:

class TelefonyInterface:
def __init__(self):
self.call = None

def dial(self, number):
self.call = ...

def hangup(self):
if self.call:
self.call.hangup()

...

执行此操作的正确方法是什么?

最佳答案

这里的问题是您正在修补 TelefonyInterface 类,该类没有属性 call。该属性是在初始化时在实例上定义的。要完成您想要的任务,请修补实例而不是类:

def test_hangup(self):
cut = TelefonyInterface()
with patch.object(cut, 'call') as call:
cut.hangup()

self.assertEqual(1, call.hangup.call_count)
self.assertEqual(None, cut.call)

关于python - 使用 @patch 装饰器模拟类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51031729/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com