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

时间:2017-08-24 15:12:03

标签: unit-testing mocking python-3.6

我有两个类方法的类。方法A调用方法B,处理他的响应并返回它。方法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"

我做错了什么?

1 个答案:

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