我想编写一个测试用例列表的测试用例。 这是我想要做的一个例子:
from mock import Mock
def method1 ():
pass
def method2 ():
pass
## The testcase will then contain:
for func in method_list:
func = Mock()
# continue to setup the mock and do some testing
我想要达到的目的如下:
步骤1)将我的本地方法变量分配给method_list中的每个项目
步骤2)Monkeypatch方法。在这个例子中,我使用的是mock.Mock对象
实际发生的是:
步骤1)方法成功分配给method_list中的项目 - 确定
然后将步骤2)方法分配给对象Mock() - NOK
我在步骤2中想要的是从method_list中获取该项目,例如method1将分配给Mock()对象。最终结果是方法和方法1都指向相同的Mock()对象
我意识到我基本上在做的是
a = b
a = c
然后期待c == b!
我想这不可能以某种方式获得指向b的指针?
答案 0 :(得分:1)
for i in range(len(method_list)): # xrange in Python 2
method_list[i] = Mock()
你所描述的更接近于C ++引用而不是指针。很少有语言具有这样的语义(少数语言提供了一个特殊的关键字,用于传递引用),包括Python。
答案 1 :(得分:1)
如果我理解正确,您想要更改变量 method1
指向的内容吗?是吗?
您可以通过修改本地变量字典中的条目来完成此操作:
for method_name in [ 'method1', 'method2' ]:
locals()[ method_name ] = Mock( )
您之前的代码没有达到您想要的效果的原因是func
是对函数method1
的引用。通过分配给is,您只需更改它指向的内容。
Monkeypatching是令人讨厌的,可能会导致许多问题。
答案 2 :(得分:1)
这样的东西?
from mock import Mock
def method1 ():
pass
def method2 ():
pass
method_list=list(f for f in globals() if hasattr(globals()[f],'__call__') and f.startswith('method'))
print method_list
## The testcase will then contain:
for func in method_list:
globals()[func] = Mock(func)
# continue to setup the mock and do some testing
但是,我不太确定这是明智之举。看起来与装饰器有关。