python - 来自另一个类的 Python 模拟类实例变量
问题描述
我想为foo_method
. 为此编写单元测试的最佳方法是什么?我怎样才能模拟Bar
对象?
代码1.py
from code2 import Bar
class Foo:
bar_instance = Bar(init1='nothing',init2='nothing')
@classmethod
def foo_method(cls):
Foo.bar_instance.bar_method()
代码2.py
class Bar:
def __init__(self,init1,init2):
self.init1 = init1
self.init2 = init2
def bar_method(self):
# do something
pass;
test_code1.py
def test_foo_method_shouldCallBarInstanceBarMethod():
#### how to write this unit test ####
解决方案
您可以使用patch.object来模拟bar_method
ofBar
类。
例如
code1.py
:
from code2 import Bar
class Foo:
bar_instance = Bar(init1='nothing', init2='nothing')
@classmethod
def foo_method(cls):
Foo.bar_instance.bar_method()
code2.py
:
class Bar:
def __init__(self, init1, init2):
self.init1 = init1
self.init2 = init2
def bar_method(self):
# do something
pass
test_code1.py
:
import unittest
from unittest.mock import patch
from code1 import Foo
from code2 import Bar
class TestFoo(unittest.TestCase):
@patch.object(Bar, 'bar_method', return_value='bar')
def test_foo_method_shouldCallBarInstanceBarMethod(self, mock_bar_method):
Foo.foo_method()
mock_bar_method.assert_called_once()
if __name__ == '__main__':
unittest.main()
带有覆盖率报告的单元测试结果:
(venv) ☁ python-codelab [master] ⚡ coverage run /Users/ldu020/workspace/github.com/mrdulin/python-codelab/src/stackoverflow/59278328/test_code1.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(venv) ☁ python-codelab [master] ⚡ coverage report -m
Name Stmts Miss Cover Missing
------------------------------------------------------------------------
src/stackoverflow/59278328/code1.py 5 0 100%
src/stackoverflow/59278328/code2.py 6 1 83% 8
src/stackoverflow/59278328/test_code1.py 10 0 100%
------------------------------------------------------------------------
TOTAL 21 1 95%
源代码:https ://github.com/mrdulin/python-codelab/tree/master/src/stackoverflow/59278328
推荐阅读
- c# - SQL Server 中整数列表的最佳替代方案是什么?
- angularjs - 使用angularJS在按键上使用正则表达式验证表单输入字段
- html - 我想使用 python 烧瓶网络服务器在 html 站点上添加用户队列
- android - 如何在 Android 中为 Dialog 设置背景透明度?
- java - FirebaseAuth:发送获取令牌时的[重新加载] RemoteException
- database-design - 在这种情况下,使用 1 个表而不是多个表有意义吗?
- python - 在代码中集成 p4python 后如何修复 P4 客户端错误?
- javascript - window.history.back() 无法正常工作
- c# - 如何通过 SQLite-net-plc 在 Xamarin.Forms 中使用“.OrderBy”?
- excel - 如何在 VBA 中使用 COUNTIF?