我有两个类方法的类。方法A调用方法B,处理他的响应并返回它。方法A由其他代码使用。我想模拟方法B,以便方法A将调用他的模拟版本,如下例所示:
class SomethingGetter:
# method B - I want to mock it
@classmethod
def get_something(cls):
return 'something'
# method A - it should use response of mocked version of method A
@classmethod
def get_formatted_something(cls):
return f'formatted {cls.get_something()}'
from module1 import SomethingGetter
# this function should use SomethingGetter with mocked class mehotd
def something_printer():
print(SomethingGetter.get_formatted_something())
from unittest import mock
from module1 import SomethingGetter
from module2 import something_printer
# I want to use this function in test insted of SomethingGetter.get_something
def get_something_else():
return SomethingGetter.get_something() + ' else'
if __name__ == '__main__':
with mock.patch('module2.SomethingGetter', autospec=True) as patched:
patched.get_something = get_something_else
something_printer()
# it prints <MagicMock name='SomethingGetter.get_formatted_something()' id='139753624280704'>;
# but I expected that it would print "formatted something else"
我做错了什么?
答案 0 :(得分:0)
通过修补module2.SomethingGetter
,您还导致get_formatted_something()
被修补。
相反,您应该只修补get_something()
方法,存储对原始文件的引用:
original = SomethingGetter.get_something
with mock.patch.object(SomethingGetter, 'get_something', lambda: original() + ' else'):
something_printer()