python - 如何更换班级?
问题描述
我正在为 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_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
- 特别是模拟 B 类patch()
。
你可以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()
请注意,您传递给装饰器的路径必须是使用B 的路径(包含类 A 的同一模块) ,而不是定义类 B 的路径。有关更多信息,请参阅修补程序的位置。
推荐阅读
- apache-spark - PySpark withCoumn 函数拉出某些字段
- python - 动态采用另一个类的实例的方法
- xml - 如何为多项选择题设计xsd?
- git - 通过不同的分支恢复对文件夹的 git 引用
- jboss - JBoss CLI:在没有名称属性的元素中添加嵌套元素(在“jwt”中添加“key”元素)
- selenium - 如何在肯定报告中附加屏幕截图?
- java - 我们可以在父类的帮助下访问不同包中的受保护变量吗
- xml - PDF Birt中的阿拉伯语翻译格式不起作用
- flutter - 如何让颤动的 webview 只显示网页的一部分
- f5 - 使用多个嵌入式 URL 字符串重定向网站请求