我正在为Python模块编写测试文件
class A:
def func(self):
B().sub_func()
class B:
def sub_func(self):
pass
并且我在测试A时需要阻止B的副作用。 我的问题是如何替换测试文件中的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')
它将打印模拟,希望它可以帮助遇到相同问题的其他人。
答案 0 :(得分:0)
如注释中所建议,您可以使用unittest.mock
-特别是patch()
来模拟B类。
您可以在测试方法上使用patch()
作为修饰符,并确保添加一个额外的参数来接收模拟的类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()
请注意,传递给装饰器的路径必须是使用的路径(包含类A的模块)不是指向B的路径被定义为。有关更多信息,请参见Where to patch。