如何mock.patch在另一个模块中导入的类

时间:2015-06-19 19:27:03

标签: python unit-testing

我有一个带有这样一个模块的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')

这些都不起作用。

3 个答案:

答案 0 :(得分:21)

您需要修补 <div id = 'scheda_mappa' class = 'tab_item' onclick = 'setMapPrg ();'> 所在的位置,以便ClassC中的ClassC

b

或者,换句话说,mock.patch('b.ClassC') 已导入到模块ClassC中,因此需要修补b的范围。

答案 1 :(得分:9)

Where to patch

  

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部分。