2015-06-19 57 views
4

我有一个Python类这样的模块的进口的类:如何mock.patch在另一个模块

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

这些工作无。

回答

7

你需要修补的ClassC位于所以这是在bClassC

mock.patch('b.ClassC') 

或者,换句话说,ClassC被导入模块b,因此这是在打补丁ClassC需求的范围。

+0

尽管已经导入了'b'。 – chepner

+1

@chepner:模拟将进行导入。 –

+0

谢谢它的作品! – Ankit

1

每次调用方法ClassA().method2()时,该方法都会查找ClassC作为全局,因此在a.b模块中找到ClassC。你需要修补位置:

mock.patch('a.b.ClassC') 

Where to patch section部分。

3

Where to patch

补丁()的工作方式(暂时)改变对象的名称指向与另一之一。可以有许多名称指向任何单个对象,因此为了修补工作,您必须确保您修补被测系统使用的名称。

的基本原则是,你修补的对象是抬头,这是不一定相同的地方,在它被定义

在你的情况,因为要修补的ClassA使用ClassC查找位置a.b.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 
+0

请不要只是转储代码,解释*为什么*这是一个答案。 –

相关问题