我如何模拟另一个类方法调用的类方法?
How can I mock classmethod that is called by another classmethod?
我有 class 和两个 class 方法。方法 A 调用方法 B,处理他的响应并 returns 它。方法 A 被其他代码使用。我想模拟方法 B,以便方法 A 将调用他的模拟版本,就像下面的示例一样:
module1.py
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()}'
module2.py
from module1 import SomethingGetter
# this function should use SomethingGetter with mocked class mehotd
def something_printer():
print(SomethingGetter.get_formatted_something())
module3.py
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"
我做错了什么?
通过修补 module2.SomethingGetter
,您还导致 get_formatted_something()
被修补。
相反,您应该只修补 get_something()
方法,存储对原始方法的引用:
original = SomethingGetter.get_something
with mock.patch.object(SomethingGetter, 'get_something', lambda: original() + ' else'):
something_printer()
我有 class 和两个 class 方法。方法 A 调用方法 B,处理他的响应并 returns 它。方法 A 被其他代码使用。我想模拟方法 B,以便方法 A 将调用他的模拟版本,就像下面的示例一样:
module1.py
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()}'
module2.py
from module1 import SomethingGetter
# this function should use SomethingGetter with mocked class mehotd
def something_printer():
print(SomethingGetter.get_formatted_something())
module3.py
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"
我做错了什么?
通过修补 module2.SomethingGetter
,您还导致 get_formatted_something()
被修补。
相反,您应该只修补 get_something()
方法,存储对原始方法的引用:
original = SomethingGetter.get_something
with mock.patch.object(SomethingGetter, 'get_something', lambda: original() + ' else'):
something_printer()