繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM