如何在 Python 测试期间替换方法?

How to replace a method during testing in Python?

我正在尝试在测试期间替换方法函数。原来的方法比较复杂,测试时想用一个简单的函数代替。

我试过使用模拟库。但是看起来它只是修改了在测试用例中直接创建的对象。如果测试用例内部的一些其他函数调用了该方法,则该方法不会被替换。


class1.py:

class Class1:
    def foo(self):
        #do a lot of calculation
        return 1

class2.py:

from .class1 import Class1

class Class2:
    def doo(self):
        my_class1 = Class1()
        return my_class1.foo()

test.py:

import mock
from .class1 import Class1
from .class2 import Class2

class Class1:
    def foo(self):
        # no calculation
        return 2

@mock.patch.object(Class1, "foo")
def test_case(mock):
    my_class2 = Class2()
    assert my_class2.doo() == 2

我正在尝试将 Class1 中的 foo() 替换为在 test.py 中创建的新 foo()。但是因为Class1对象是在Class2对象内部创建的,所以方法没有这样替换。`

你必须嘲笑正确的事情。 Class2.doo 创建了一个 class2.Class1 的实例,而不是 test.Class1 (模拟时名称很重要,class2test 每个都有自己的全局范围)。

import mock
import class2


@mock.patch.object(class2.Class1, 'foo', return_value=2)
def test_case(mock):
    my_class2 = class2.Class2()
    assert my_class2.doo() == 2