我与 python mock 的斗争

my struggle with python mock

我正在 python 中学习模拟,但我什至无法进行基本的模拟工作。请提出您的建议以修复以下代码片段..

from mock import patch

def dec_print(msg)
    print("+++ " + msg)

@patch("print", dec_print)
def fun():
    print("Hello");


fun()

谢谢 裘德

print 这样的模拟内置函数有点棘手。首先,您需要知道它们存储在一个特殊的 __builtins__ 模块中:

>>> __builtins__.print("hello world")
hello world

因此,您需要修补 __builtins__ 模块。我首先尝试了这些:

@patch("__builtins__.print", dec_print)
#and
@patch("__builtin__.print", dec_print)

但这两个都给出了 ImportError

接下来,我尝试了 mock.patch 而不是 mock,它允许您指定要修补的对象(而不是使用字符串导入对象):

@patch.object(__builtins__, "print", dec_print)

这行得通,但是由于您在 dec_print 内部调用 print,您会收到 RuntimeError: maximum recursion depth exceeded 错误。

因此,要解决此问题,您可以将 print 替换为 sys.stdout.write。这是模拟 print:

的最终工作代码
import sys

from mock import patch

def dec_print(msg):
    sys.stdout.write("+++ {}\n".format(msg))

@patch.object(__builtins__, "print", dec_print)
def fun():
    print("Hello")

if __name__ == "__main__":
    fun()

输出:

$ python x.py
+++ Hello

编辑:响应您发布的新信息(它打印消息两次,一次有模拟,一次没有):

你看到它打印了两次,因为你把 fun() 放在模块的顶层,所以它在 @patch 导入 tstmock 时运行,然后它再次正常运行。您应该将此调用包装在 if __name__ == '__main__': 块中(解释为 here)。

...original code...

if __name__ == "__main__":
    fun()

非常感谢您的输入,我设法通过如下更改代码来开始工作。

from mock import patch

def log(msg):
    print(msg)

def dec_print(msg):
    print("+++ " + msg)

@patch("tstmock.log", dec_print)
def fun():
    log("Hello")

fun()

然而,即使在我修补函数日志之后,它仍被调用并生成以下输出

+++ Hello
Hello