gpt4 book ai didi

Python 猴子补丁私有(private)函数

转载 作者:太空狗 更新时间:2023-10-30 00:03:32 25 4
gpt4 key购买 nike

我有一个模块,其中有一个函数(称为 a())调用同一模块中定义的另一个函数(称为 __b())。 __b() 是一个通过 urllib2 与网站对话并获取一些数据的函数。现在我正在尝试测试 a(),但我当然不想让我的单元测试与公共(public)互联网对话。因此,我在想,如果我可以使用返回固定数据的函数来猴子修补 __b(),那么我就可以为 a() 编写测试。

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

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

def __b(args):
return something_complex_with_args

所以现在我想测试 a(),但我需要猴子修补 __b。问题是 A) 绝大多数关于猴子补丁的信息适用于类的方法,而不是模块中的函数,以及 B) 我想要猴子补丁的函数是私有(private)的。如果它使过程更可行,我愿意将 __b 更改为非私有(private)的,但我宁愿不这样做。

建议?

编辑:就目前而言,测试类如下所示:

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)?

我的模块.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>

似乎工作正常。


或者单元测试之外:

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 猴子补丁私有(private)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14046623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com