python - Python Unittest模拟问题
问题描述
在 project/scripts 目录下,main.py
Class BaseClass:
fun1(self):
print(“fun1”)
fun2(self):
print(“fun2”)
def run():
try:
v=BaseClass()
v.fun1()
v.fun2()
except:
log.exception(“Failed”)
在项目/测试目录下 test_main.py
from main import BaseClass, run
from unittest import mock, TestCase
Class TestRun(TestCase):
def test_run(self):
with mock.patch(‘scripts.main.BaseClass’) as mock_base:
mock_base.return_value = mock.Mock( **{
‘fun1.return_value’ : True, ‘fun2.return_value’: True })
run()
mock_base.assert_called()
mock_base.assert_called_once(fun1)
self.assertTrue(mock_base.called)
问题是 run() 没有拾取模拟的 BaseClass,因此断言失败。请任何人都可以建议如何解决这个问题?
解决方案
规则是您必须在使用对象的地方修补对象。在这里,您调用在模块 ( )run
中找到的函数。所以你应该直接在模块中打补丁:main
from main import BaseClass, run
BaseClass
main
from main import BaseClass, run
from unittest import mock, TestCase
class TestRun(TestCase):
def test_run(self):
with mock.patch('main.BaseClass') as mock_base:
mock_base.return_value = mock.Mock( **{
'fun1.return_value' : True, 'fun2.return_value': True })
run()
mock_base.assert_called()
mock_base.assert_called_once()
self.assertTrue(mock_base.called)
推荐阅读
- node.js - 共享节点插件
- javascript - Sequelize Query FindAll 不过滤
- javascript - JavaScript - 勾选复选框时更改ul以显示的功能
- django - 连接postgresql并在同一个项目上使用虚拟环境和docker
- unit-testing - Flutter 小部件单元测试抛出未找到方向性小部件
- javascript - 如何在烧瓶中同时发送文件和更多信息?
- python - GPU tensorflow 在笔记本电脑上的运行速度比 CPU tensorflow 慢?
- c# - 如何在 vsto c# 中组合 dasl 的多个查询?以下查询
- c# - form1 字符串不传递给 form2
- logic - VHDL:计数器检查