我在某个模块中有一个函数,我想在运行时重新定义(模拟)以进行测试。据我所知,函数定义只不过是python中的赋值(模块定义本身就是一种正在执行的函数)。正如我所说,我想在测试用例的设置中这样做,因此要重新定义的功能存在于另一个模块中。这样做的语法是什么? 例如,'module1'是我的模块,'func1'是我的函数,在我的测试用例中我试过这个(没有成功):
import module1
module1.func1 = lambda x: return True
答案 0 :(得分:11)
import module1
import unittest
class MyTest(unittest.TestCase):
def setUp(self):
# Replace othermod.function with our own mock
self.old_func1 = module1.func1
module1.func1 = self.my_new_func1
def tearDown(self):
module1.func1 = self.old_func1
def my_new_func1(self, x):
"""A mock othermod.function just for our tests."""
return True
def test_func1(self):
module1.func1("arg1")
许多模拟库提供了进行此类模拟的工具,您应该对它们进行调查,因为您可能会从中获得大量帮助。
答案 1 :(得分:4)
import foo
def bar(x):
pass
foo.bar = bar
答案 2 :(得分:2)
只需为旧名称指定一个新函数或lambda:
>>> def f(x):
... return x+1
...
>>> f(3)
4
>>> def new_f(x):
... return x-1
...
>>> f = new_f
>>> f(3)
2
当函数来自另一个模块时,它也可以工作:
### In other.py:
# def f(x):
# return x+1
###
import other
other.f = lambda x: x-1
print other.f(1) # prints 0, not 2
答案 3 :(得分:2)
使用redef:http://github.com/joeheyming/redef
import module1
from redef import redef
rd_f1 = redef(module1, 'func1', lambda x: True)
当rd_f1超出范围或被删除时,func1将恢复正常
答案 4 :(得分:1)
如果要重新加载到正在编辑的解释器文件foo.py中,可以创建一个简单的类型函数并使用execfile(),但我刚刚知道没有全局列表它不起作用所有功能(遗憾地),除非有人有更好的想法:
文件foo.py中的某处:
def refoo ():
global fooFun1, fooFun2
execfile("foo.py")
在python解释器中:
refoo()#您现在可以从foo.py
获得最新的编辑内容