如何替换一个class?
How to replace a class?
我正在为 Python 模块编写测试文件
class A:
def func(self):
B().sub_func()
class B:
def sub_func(self):
pass
我在测试 A 时需要 block B 的副作用。
我的问题是如何替换测试文件中的 class B。
class ATest(unittest.TestCase):
def test_a(self):
a=A()
a.func()
#now object a will invoke a func that B is a mock class
按照已接受答案的说明进行操作。我完成了测试
tws/main.py
class A(object):
def func(self):
b=B()
print('func ')
b.sub_func()
class B(object):
def sub_func(self):
print('real sub')
c=C()
c.c_sub_func()
class C(object):
def c_sub_func(self):
print('c')
test/test_mock.py
import unittest
from unittest.mock import patch
from tws.main import A
class B():
def sub_func(self):
print('mock')
return 12
class TestMock(unittest.TestCase):
@patch('tws.main.B',new=B)
def test_af(self):
a=A()
print(a.__dict__)
a.func()
print('rrr')
它会打印模拟,希望它能帮助其他有同样问题的人。
如评论中所建议,您可以使用 unittest.mock
模拟 class B - 特别是 patch()
。
您可以使用 patch()
作为测试方法的装饰器,确保添加额外的参数来接收模拟的 class B:
from unittest.mock import patch
class ATest(unittest.TestCase):
@patch('package.module.B')
def test_a(self, mock_b): # mock_b will hold the mocked class B
a = A()
a.func()
注意你传递给装饰器的路径必须是使用的路径(同一个包含classA的模块) not 定义 class B 的路径。有关详细信息,请参阅 Where to patch。
我正在为 Python 模块编写测试文件
class A:
def func(self):
B().sub_func()
class B:
def sub_func(self):
pass
我在测试 A 时需要 block B 的副作用。 我的问题是如何替换测试文件中的 class B。
class ATest(unittest.TestCase):
def test_a(self):
a=A()
a.func()
#now object a will invoke a func that B is a mock class
按照已接受答案的说明进行操作。我完成了测试
tws/main.py
class A(object):
def func(self):
b=B()
print('func ')
b.sub_func()
class B(object):
def sub_func(self):
print('real sub')
c=C()
c.c_sub_func()
class C(object):
def c_sub_func(self):
print('c')
test/test_mock.py
import unittest
from unittest.mock import patch
from tws.main import A
class B():
def sub_func(self):
print('mock')
return 12
class TestMock(unittest.TestCase):
@patch('tws.main.B',new=B)
def test_af(self):
a=A()
print(a.__dict__)
a.func()
print('rrr')
它会打印模拟,希望它能帮助其他有同样问题的人。
如评论中所建议,您可以使用 unittest.mock
模拟 class B - 特别是 patch()
。
您可以使用 patch()
作为测试方法的装饰器,确保添加额外的参数来接收模拟的 class B:
from unittest.mock import patch
class ATest(unittest.TestCase):
@patch('package.module.B')
def test_a(self, mock_b): # mock_b will hold the mocked class B
a = A()
a.func()
注意你传递给装饰器的路径必须是使用的路径(同一个包含classA的模块) not 定义 class B 的路径。有关详细信息,请参阅 Where to patch。