我如何模拟另一个类方法调用的类方法?

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()