深度模拟与方法替换

时间:2017-10-16 20:55:05

标签: python mocking

唯一可以使用的是模拟。

#tested.py
from somemodule import somelogger

class MyClass(object):
    def __init__(self):
        self.logger = somelogger()

    def do_smth(self):
        self.logger.log(message)

重要 详细信息:模块somemodule不存在,因此@patch等常用解决方案不适用。

我需要模仿somemodule somelogger's方法log才能执行简单的打印:

#tests.py
from tested import MyClass


def test_logging():
    obj = MyClass()
    obj.do_smth('some_message')

在控制台中:

some_message

1 个答案:

答案 0 :(得分:0)

我认为这样做的方法是使用此处所述的unittest.mock.patch方法:https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch

在tests.py文件中,创建一个模拟的日志方法来进行打印。

# tests.py
from tested import MyClass
from unittest.mock import patch

def mocked_log(log_msg):
    print(log_msg)

@patch('tested.somelogger.log')
def test_logging(mock_logger)
    mock_logger.return_value = mocked_log

    obj = MyClass()
    obj.do_smth('some message')