我与 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
我正在 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