Python猴子补丁私有功能
作者:互联网
我有一个带有函数的模块(称之为a()),它调用在同一模块中定义的另一个函数(称之为__b()). __b()是一个通过urllib2与网站对话并获取一些数据的函数.现在我正在尝试测试(),但当然不希望我的单元测试与公共互联网对话.因此,我在想是否可以使用返回固定数据的函数来修补__b(),然后我可以为()编写测试.
更具体一点,我的模块看起来有点像:
def a():
return __b("someval")
def __b(args):
return something_complex_with_args
所以现在我想测试一个(),但我需要修补__b.问题是A)关于猴子补丁的绝大多数信息适用于类的方法,而不适用于模块中的函数,以及B)我想要猴子补丁的函数是私有的.如果它使这个过程更可行,我愿意将__b改为非私有,但不愿意.
建议?
编辑:因为它代表测试类看起来像:
from unittest import TestCase
import mymodule
def newfn(args):
return {"a" : "b"}
mymodule._b = newfn
class TestMyModule(TestCase):
def test_basic(self):
print(mymodule.a('somearg'))
当我运行它时,如果没有完成猴子修补,我会看到输出,而不是看到{‘a’:’b’}被打印出来.
解决方法:
我似乎无法重现你的问题(我已经稍微调整了你的例子,因为它根本没有运行).你有没有错误的东西(比如mymodule._b而不是mymodule .__ b)?
mymodule.py:
def a(x):
return __b("someval")
def __b(args):
return "complex_thingy: {}".format(args)
mytest.py:
from unittest import TestCase
import mymodule
def newfn(args):
return {"a" : "b"}
mymodule.__b = newfn
class TestMyModule(TestCase):
def test_basic(self):
print(mymodule.a('somearg'))
输出:
C:\TEMP>python -m unittest mytest
{'a': 'b'}
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
C:\TEMP>
似乎工作正常.
或者在unittest之外:
mytest2.py:
import mymodule
def newfn(args):
return {"a" : "b"}
mymodule.__b = newfn
print(mymodule.a('somearg'))
输出:
C:\TEMP>python mytest2.py
{'a': 'b'}
C:\TEMP>
标签:python,monkeypatching 来源: https://codeday.me/bug/20190520/1143793.html