如何在 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
(模拟时名称很重要,class2
和 test
每个都有自己的全局范围)。
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
我正在尝试在测试期间替换方法函数。原来的方法比较复杂,测试时想用一个简单的函数代替。
我试过使用模拟库。但是看起来它只是修改了在测试用例中直接创建的对象。如果测试用例内部的一些其他函数调用了该方法,则该方法不会被替换。
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
(模拟时名称很重要,class2
和 test
每个都有自己的全局范围)。
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