我有一个带有这样一个模块的python类:
xy.py
from a.b import ClassA
class ClassB:
def method_1():
a = ClassA()
a.method2()
然后我将ClassA定义为:
b.py
from c import ClassC
class ClassA:
def method2():
c = ClassC()
c.method3()
现在在这段代码中,在为xy.py编写测试时我想要mock.patch ClassC,有没有办法在python中实现呢?
显然我试过了:
mock.patch('a.b.ClassA.ClassC)
和
mock.patch('a.b.c.ClassC')
这些都不起作用。
答案 0 :(得分:21)
您需要修补 <div id = 'scheda_mappa' class = 'tab_item' onclick = 'setMapPrg ();'>
所在的位置,以便ClassC
中的ClassC
:
b
或者,换句话说,mock.patch('b.ClassC')
已导入到模块ClassC
中,因此需要修补b
的范围。
答案 1 :(得分:9)
patch()通过(临时)更改名称指向的对象与另一个对象。可以有许多名称指向任何单个对象,因此要修补工作,您必须确保修补被测系统使用的名称。
基本原则是您在查找对象的位置进行修补,这不一定与定义的位置相同。
在您的情况下,查找位置为a.b.ClassC
,因为您要修补ClassC
中使用的ClassA
。
import mock
with mock.patch('a.b.ClassC') as class_c:
instance = class_c.return_value # instance returned by ClassC()
b = ClassB()
b.method1()
assert instance.method3.called == True
答案 2 :(得分:1)
每次调用方法ClassA().method2()
时,该方法都会将ClassC
查找为全局,从而在ClassC
模块中查找a.b
。您需要修补那个位置:
mock.patch('a.b.ClassC')
请参阅Where to patch section部分。