Python猴子补丁私有功能

Ada*_*kin 6 python monkeypatching

我有一个带有函数(调用它a())的模块,它调用在同一模块中定义的另一个函数(调用它__b()). __b()是一个通过网站说话urllib2并获取一些数据的功能.现在我正在尝试测试a(),但当然不希望我的单元测试与公共互联网对话.因此,我在想,如果我可以__b()使用返回固定数据的函数来修补补丁,那么我可以编写测试a().

更具体一点,我的模块看起来有点像:

def a():
    return __b("someval")

def __b(args):
    return something_complex_with_args
Run Code Online (Sandbox Code Playgroud)

所以现在我想测试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'))
Run Code Online (Sandbox Code Playgroud)

当我运行它时,如果没有完成猴子修补,我会看到输出,而不是看到{'a': 'b'}打印出来.

jef*_*upp 2

如果您的模块名为“foo”,则以下内容应该有效。

import foo

def patched_version():
    return 'Hello'

foo.__b = patched_version

print (foo.a())
Run Code Online (Sandbox Code Playgroud)

foo.py 在哪里

def a():
    return __b()

def __b():
    return 'Goodbye'
Run Code Online (Sandbox Code Playgroud)