python - 如何模拟由类的对象调用的函数?
问题描述
我将首先承认我刚刚进入 python 模拟或任何模拟这一天或两天。
所以我有一个python文件,里面有一个类:
我的文件A.py
class A:
def Afunc():
#do smthn
现在我想模拟一个使用这个 MyFileA.py 的不同脚本
我的文件B.py
from MyFileA import A
def Bfunc():
Aobj = A()
ReturnVal = Aobj.Afunc()
如何模拟语句Aobj.Afunc()
以返回特定值?
另外,我专门使用装饰器来模拟方法,所以我只期待这种格式的解决方案。
解决方案
您可以使用mock.patch来模拟类A
及其Afunc
返回值。
例如
MyFileA.py
:
class A:
def Afunc():
print('do smthn')
MyFileB.py
:
from MyFileA import A
def Bfunc():
Aobj = A()
ReturnVal = Aobj.Afunc()
return ReturnVal
test_MyFileB.py
:
import unittest
from MyFileB import Bfunc
from unittest import mock
class TestMyFileB(unittest.TestCase):
@mock.patch('MyFileB.A')
def test_Bfunc(self, mock_A):
a_instance = mock_A.return_value
a_instance.Afunc.return_value = "mocked value"
actual = Bfunc()
self.assertEqual(actual, 'mocked value')
mock_A.assert_called_once()
a_instance.Afunc.assert_called_once()
if __name__ == '__main__':
unittest.main()
带有覆盖率报告的单元测试结果:
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Name Stmts Miss Cover Missing
--------------------------------------------------------------------------
src/stackoverflow/63429593/MyFileA.py 3 1 67% 3
src/stackoverflow/63429593/MyFileB.py 5 0 100%
src/stackoverflow/63429593/test_MyFileB.py 13 0 100%
--------------------------------------------------------------------------
TOTAL 21 1 95%
推荐阅读
- storybook - @storybook/addon-info 和 @material-ui/core 的问题
- gitlab - 如何在 gitlab 中推送到新创建的项目
- c++ - 读取 UNICODE_STRING 的缓冲区时访问冲突
- java - Swagger API 中声明为不需要的 QueryParam
- php - 警告:mysqli_fetch_row() 期望参数 1 为 mysqli_result,给定 null
- php - 如何在 URL 中添加参数以在同一页面上显示不同的内容?
- visual-studio-app-center - Xamarin UItest 是否支持本地?还是现在只适用于应用中心?
- python - Scrapy:meta['proxy'] 还是 meta['proxy']?
- grid - Extjs 可编辑网格将行推开
- python-3.7 - sys.executable 的 Python 3.7 无法识别的字符