编程语言
首页 > 编程语言> > Python猴子补丁私有功能

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