[英]How to mock.patch a class imported in another module
我有一个带有这样一个模块的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 编写测试时我想模拟.patch ClassC,有没有办法在 python 中实现它?
显然我试过:
mock.patch('a.b.ClassA.ClassC')
和
mock.patch('a.b.c.ClassC')
这些都没有奏效。
您需要修补ClassC
所在的位置,以便在b
ClassC
:
mock.patch('b.ClassC')
或者,换句话说, ClassC
被导入到模块b
,因此这就是ClassC
需要修补的范围。
patch() 通过(临时)将名称指向的对象更改为另一个对象。 可以有许多名称指向任何单个对象,因此要使修补工作,您必须确保修补被测系统使用的名称。
基本原则是在查找对象的位置打补丁,该位置不一定与定义对象的位置相同。
在您的情况下,查找位置是abClassC
因为您想修补ClassA
使用的ClassC
。
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
每次调用方法ClassA().method2()
,该方法都会将ClassC
作为全局查找,从而在ab
模块中找到ClassC
。 您需要修补该位置:
mock.patch('a.b.ClassC')
请参阅修补位置部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.