我有一个带有函数(调用它a()
)的模块,它调用同一模块中定义的另一个函数(调用它__b()
)。 __b()
是一个与网站对话urllib2
并获取一些数据的功能。现在我正在尝试测试a()
,但当然希望我的单元测试不与公共互联网对话。因此,我在想如果我可以__b()
用一个返回罐头数据的函数进行修补,然后我可以为a()
.
更具体地说,我的模块看起来有点像:
def a():
return __b("someval")
def __b(args):
return something_complex_with_args
所以现在我想测试a()
,但我需要猴子补丁__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'}
打印出来。